ural 1519 插頭DP 入門

來源:互聯網
上載者:User

總體上參考ccy,不說了,上代碼

#include<stdio.h>#include<string.h>#include<iostream>#define LL long long#define LMTh 1997000using namespace std;int a[15][15],jz[15],total[2];LL sum[2][200000];LL state[2][200000];int Hash[LMTh];int n,m,nn,mm,k;inline int cango(int i,int j){   if(i>n||j>m||i<=0||j<=0)return 0;    if(0==a[i][j])return 0;    return 1;}void mov(void){    int i;    jz[0]=0;    for(i=1;i<=14;i++)    jz[i]=i<<1;}void hash_in(LL s,LL data){    int hashpos=s%LMTh;    while(Hash[hashpos])    {        if(state[k][Hash[hashpos]]==s)        {            sum[k][Hash[hashpos]]+=data;            return;        }        hashpos=(hashpos+1)%LMTh;//剛多加了個“+”    }    total[k]++;    Hash[hashpos]=total[k];    state[k][total[k]]=s;sum[k][total[k]]=data;}LL work(void){    LL ans=0;k=0;    int i,j,u,v;        memset(Hash,0,sizeof(Hash));        memset(sum[k],0,sizeof(sum[k]));        memset(state[k],0,sizeof(state[k]));        total[k]=0;        hash_in(0,1);    for( i=1;i<=n;i++)    {        for( j=1;j<=m;j++)        {                            k^=1;                memset(Hash,0,sizeof(Hash));                memset(sum[k],0,sizeof(sum[k]));                memset(state[k],0,sizeof(state[k]));                total[k]=0;            for( u=1;u<=total[1-k];u++)            {                LL s=state[1-k][u];                LL data=sum[1-k][u];                int p=(s>>jz[j-1])%4;                int q=(s>>(jz[j]))%4;                if(0==a[i][j])                {                    if(p==0&&q==0)                      hash_in(s,data);                }                else                {                    if(p==0&&q==0)                    {                       if(cango(i,j+1)&&cango(i+1,j))                       {                        LL temp=s+(1<<jz[j-1])+(2<<jz[j]);                        hash_in(temp,data);                       }                        continue;                    }                    if(p==0&&q>0)                    {                        if(cango(i,j+1))                          hash_in(s,data);                        if(cango(i+1,j))//這裡居然會漏                        {                            LL temp=s-(q<<jz[j]);                            temp+=(q<<jz[j-1]);                            hash_in(temp,data);                        }                        continue;                    }                    if(p>0&&q==0)                    {                        if(cango(i+1,j))                          hash_in(s,data);                        if(cango(i,j+1))                        {                            LL temp=s-(p<<jz[j-1]);                            temp+=p<<jz[j];                            hash_in(temp,data);                        }                        continue;                    }                    if(p==1&&q==1)                    {                        int bra=1;                        LL temp;                        for( v=j+1;v<=m;v++)                        {                            int w=(s>>jz[v])%4;                            if(w==1)bra++;                            else if(w==2)bra--;                            if(bra==0)                            {                               temp=s-(1<<jz[v]);                               break;                            }                        }                        temp-=(1<<jz[j-1])+(1<<jz[j]);                        hash_in(temp,data);                        continue;                    }                    if(p==2&&q==2)                    {                        int bra=1;                        LL temp;                        for(int v=j-2;v>0;v--)                        {                            int w=(s>>jz[v])%4;                            if(w==2)bra++;                            if(w==1)bra--;                            if(bra==0)                            {                                temp=s+(1<<jz[v]);                                break;                            }                        }                        temp-=(2<<jz[j])+(2<<jz[j-1]);                        hash_in(temp,data);                        continue;                    }                    if(p==2&&q==1)                    {                        LL temp=s-(p<<jz[j-1])-(q<<jz[j]);                        hash_in(temp,data);                        continue;                    }                    if(p==1&&q==2&&i==nn&&j==mm)                     ans+=data;                }            }        }        for(int i=1;i<=total[k];i++)        state[k][i]=state[k][i]<<2;    }    return ans;}int main(){      mov();      int i,j;      char str[16];        scanf("%d%d",&n,&m);getchar();        memset(a,0,sizeof(a));        for( i=1;i<=n;i++)        {            scanf("%s",&str[1]);            for(j=1;str[j];j++)            if(str[j]=='.')            {                a[i][j]=1;                nn=i;                mm=j;            }            else if(str[j]=='*')a[i][j]=0;        }        cout<<work()<<endl;//聽說要改成這樣    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.