首页 > 代码库 > 初探插头dp
初探插头dp
开学那个月学了点新东西,不知道还记不记得了,mark一下
感觉cdq的论文讲的很详细
题主要跟着kuangbin巨做了几道基础的
http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710343.html
还有几道没做,留着坑
感觉广义括号表示法虽然神奇,但一般最小表示法就够用了吧,感觉最小表示法更直观一点
hdu1693
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 typedef long long ll; 5 using namespace std; 6 ll f[13][13][1<<13]; 7 int a[13][13]; 8 int n,m,cas; 9 10 int main() 11 { 12 scanf("%d",&cas); 13 for (int tt=1; tt<=cas; tt++) 14 { 15 scanf("%d%d",&n,&m); 16 for (int i=1; i<=n; i++) 17 for (int j=1; j<=m; j++) 18 scanf("%d",&a[i][j]); 19 printf("Case %d: ",tt); 20 memset(f,0,sizeof(f)); 21 f[0][m][0]=1; 22 for (int i=1; i<=n; i++) 23 { 24 for (int j=0; j<(1<<m); j++) 25 f[i][0][j<<1]=f[i-1][m][j]; 26 for (int j=1; j<=m; j++) 27 { 28 for (int st=0; st<(1<<(m+1)); st++) 29 { 30 int x=1<<j,y=1<<(j-1); 31 if (a[i][j]) 32 { 33 if ((st&x)&&(st&y)) f[i][j][st]=f[i][j-1][st^x^y]; 34 else if (!(st&x)&&!(st&y)) f[i][j][st]=f[i][j-1][st|x|y]; 35 else f[i][j][st]=f[i][j-1][st]+f[i][j-1][st^x^y]; 36 } 37 else { 38 if (!(st&x)&&!(st&y)) f[i][j][st]=f[i][j-1][st]; 39 else f[i][j][st]=0; 40 } 41 } 42 } 43 } 44 printf("There are %lld ways to eat the trees.\n",f[n][m][0]); 45 } 46 return 0; 47 }
poj1793(男人八题!)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 typedef long long ll; 5 const int mo=30007; 6 const int maxl=1000010; 7 using namespace std; 8 struct node{ 9 int p[mo],nex[maxl],len; 10 ll st[maxl],f[maxl]; 11 void clr() 12 { 13 len=0; memset(p,255,sizeof(p)); 14 } 15 void push(ll nw,ll s) 16 { 17 int x=nw%mo; 18 for (int i=p[x];i!=-1; i=nex[i]) 19 if (st[i]==nw) 20 { 21 f[i]+=s; 22 return; 23 } 24 st[++len]=nw; f[len]=s; 25 nex[len]=p[x]; p[x]=len; 26 } 27 } h[2]; 28 int n,m,cas,p,ex,ey; 29 int a[15][15],b[15],v[15]; 30 31 void get(ll st) 32 { 33 for (int i=m; i>=0; i--) 34 { 35 b[i]=st&7; 36 st>>=3; 37 } 38 } 39 40 ll put() 41 { 42 memset(v,255,sizeof(v)); v[0]=0; 43 ll st=0; int t=0; 44 for (int i=0; i<=m; i++) 45 { 46 if (v[b[i]]==-1) v[b[i]]=++t; 47 b[i]=v[b[i]]; 48 st<<=3; st|=b[i]; 49 } 50 return st; 51 } 52 53 void shift() 54 { 55 for (int i=m;i; i--) b[i]=b[i-1]; 56 b[0]=0; 57 } 58 59 void work(int j,int k) 60 { 61 if (j==m) shift(); 62 h[p].push(put(),h[1-p].f[k]); 63 } 64 65 void dp(int i,int j) 66 { 67 for (int k=1; k<=h[1-p].len; k++) 68 { 69 get(h[1-p].st[k]); 70 if (!a[i][j]) 71 { 72 b[j]=b[j-1]=0; work(j,k); 73 continue; 74 } 75 int x=b[j],y=b[j-1]; 76 if (x&&y) 77 { 78 if ((x==y&&i==ex&&j==ey)||(x!=y)) 79 { 80 b[j]=b[j-1]=0; 81 if (x!=y) 82 for (int r=0; r<=m; r++) if (b[r]==x) b[r]=y; 83 work(j,k); 84 } 85 } 86 else if ((x&&!y)||(!x&&y)) 87 { 88 int r=x+y; 89 if (a[i][j+1]) {b[j]=r; b[j-1]=0; work(j,k);} 90 if (a[i+1][j]) {b[j-1]=r; b[j]=0; work(j,k);} 91 } 92 else if (a[i][j+1]&&a[i+1][j]) 93 { 94 b[j]=b[j-1]=m+1; 95 work(j,k); 96 } 97 } 98 } 99 100 int main() 101 { 102 char s[12]; 103 scanf("%d%d",&n,&m); 104 while (n&&m) 105 { 106 memset(a,0,sizeof(a)); 107 for (int i=1; i<=n; i++) 108 { 109 scanf("%s",s+1); 110 for (int j=1; j<=m; j++) 111 if (s[j]==‘.‘) a[i][j]=1; 112 } 113 for (int i=1; i<=m; i++) 114 { 115 a[n+2][i]=1; 116 a[n+1][i]=(i>1&&i<m)?0:1; 117 } 118 n+=2; ex=n; ey=m; 119 h[0].clr(); 120 h[0].push(0,1); p=0; 121 for (int i=1; i<=n; i++) 122 for (int j=1; j<=m; j++) 123 { 124 p^=1; h[p].clr(); 125 dp(i,j); 126 } 127 ll ans=0; 128 for (int i=1; i<=h[p].len; i++) 129 ans+=h[p].f[i]; 130 printf("%lld\n",ans); 131 scanf("%d%d",&n,&m); 132 } 133 return 0; 134 }
fzu1977
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 typedef long long ll; 5 const int mo=30007; 6 const int maxl=300010; 7 using namespace std; 8 struct node{ 9 int p[mo],nex[maxl],len; 10 ll st[maxl],f[maxl]; 11 void clr() 12 { 13 len=0; memset(p,255,sizeof(p)); 14 } 15 void push(ll nw,ll s) 16 { 17 int x=nw%mo; 18 for (int i=p[x];i!=-1; i=nex[i]) 19 if (st[i]==nw) 20 { 21 f[i]+=s; 22 return; 23 } 24 st[++len]=nw; f[len]=s; 25 nex[len]=p[x]; p[x]=len; 26 } 27 } h[2]; 28 int n,m,cas,p,ex,ey; 29 int a[15][15],b[15],v[15]; 30 31 void get(ll st) 32 { 33 b[m+1]=st&1; st>>=1; 34 for (int i=m; i>=0; i--) 35 { 36 b[i]=st&7; 37 st>>=3; 38 } 39 } 40 41 ll put() 42 { 43 memset(v,255,sizeof(v)); v[0]=0; 44 ll st=0; int t=0; 45 for (int i=0; i<=m; i++) 46 { 47 if (v[b[i]]==-1) v[b[i]]=++t; 48 b[i]=v[b[i]]; 49 st<<=3; st|=b[i]; 50 } 51 st<<=1; st|=b[m+1]; 52 return st; 53 } 54 55 void shift() 56 { 57 for (int i=m;i; i--) b[i]=b[i-1]; 58 b[0]=0; 59 } 60 61 void dp(int i,int j) 62 { 63 for (int k=1; k<=h[p^1].len; k++) 64 { 65 get(h[p^1].st[k]); 66 if (!a[i][j]) 67 { 68 b[j]=b[j-1]=0; 69 h[p].push(put(),h[p^1].f[k]); 70 continue; 71 } 72 int x=b[j],y=b[j-1]; 73 if (b[m+1]) 74 { 75 if (!x&&!y&&a[i][j]!=1) 76 { 77 b[j]=b[j-1]=0; 78 h[p].push(put(),h[p^1].f[k]); 79 } 80 continue; 81 } 82 if (x&&y) 83 { 84 b[j]=b[j-1]=0; 85 if (x!=y){ 86 for (int r=0; r<=m; r++) if (b[r]==x) b[r]=y; 87 } 88 else b[m+1]=1; 89 h[p].push(put(),h[p^1].f[k]); 90 } 91 else if ((x&&!y)||(!x&&y)) 92 { 93 int r=x+y; 94 if (a[i][j+1]) 95 { 96 b[j]=r; b[j-1]=0; 97 h[p].push(put(),h[p^1].f[k]); 98 } 99 if (a[i+1][j]) 100 { 101 b[j-1]=r; b[j]=0; 102 h[p].push(put(),h[p^1].f[k]); 103 } 104 } 105 else { 106 if (a[i][j+1]&&a[i+1][j]) 107 { 108 b[j]=b[j-1]=m+1; 109 h[p].push(put(),h[p^1].f[k]); 110 } 111 if (a[i][j]==2) 112 { 113 b[j]=b[j-1]=0; 114 h[p].push(put(),h[p^1].f[k]); 115 } 116 } 117 } 118 } 119 120 int main() 121 { 122 char s[15]; int cas; 123 scanf("%d",&cas); 124 for (int tt=1; tt<=cas; tt++) 125 { 126 scanf("%d%d",&n,&m); 127 memset(a,0,sizeof(a)); 128 for (int i=1; i<=n; i++) 129 { 130 scanf("%s",s+1); 131 for (int j=1; j<=m; j++) 132 if (s[j]==‘O‘) a[i][j]=1; 133 else if (s[j]==‘*‘) a[i][j]=2; 134 } 135 h[0].clr(); 136 h[0].push(0,1); p=0; 137 for (int i=1; i<=n; i++) 138 { 139 p^=1; h[p].clr(); 140 for (int k=1; k<=h[p^1].len; k++) 141 { 142 get(h[p^1].st[k]); shift(); 143 h[p].push(put(),h[p^1].f[k]); 144 } 145 for (int j=1; j<=m; j++) 146 { 147 p^=1; h[p].clr(); 148 dp(i,j); 149 } 150 } 151 ll ans=0; 152 for (int i=1; i<=h[p].len; i++) 153 ans+=h[p].f[i]; 154 printf("Case %d: %I64d\n",tt,ans); 155 } 156 return 0; 157 }
hdu3377
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 typedef long long ll; 5 const int mo=30007; 6 const int maxl=1000010; 7 const int inf=-100000007; 8 using namespace std; 9 struct node{ 10 int p[mo],nex[maxl],len,f[maxl]; 11 ll st[maxl]; 12 void clr() 13 { 14 len=0; memset(p,255,sizeof(p)); 15 } 16 void push(ll nw,int s) 17 { 18 int x=nw%mo; 19 for (int i=p[x];i!=-1; i=nex[i]) 20 if (st[i]==nw) 21 { 22 f[i]=max(f[i],s); 23 return; 24 } 25 st[++len]=nw; f[len]=s; 26 nex[len]=p[x]; p[x]=len; 27 } 28 } h[2]; 29 int n,m,cas,p,ex,ey; 30 int a[15][15],b[15],v[15]; 31 32 void get(ll st) 33 { 34 for (int i=m; i>=0; i--) 35 { 36 b[i]=st&7; 37 st>>=3; 38 } 39 } 40 41 ll put() 42 { 43 memset(v,255,sizeof(v)); v[0]=0; 44 ll st=0; int t=0; 45 for (int i=0; i<=m; i++) 46 { 47 if (v[b[i]]==-1) v[b[i]]=++t; 48 b[i]=v[b[i]]; 49 st<<=3; st|=b[i]; 50 } 51 return st; 52 } 53 54 void shift() 55 { 56 for (int i=m;i; i--) b[i]=b[i-1]; 57 b[0]=0; 58 } 59 60 void dp(int i,int j) 61 { 62 for (int k=1; k<=h[1-p].len; k++) 63 { 64 get(h[1-p].st[k]); 65 int x=b[j],y=b[j-1]; 66 if (i==1&&j==1) 67 { 68 if (i<n) {b[j-1]=m+1; b[j]=0; h[p].push(put(),h[1-p].f[k]+a[i][j]);} 69 if (j<m) {b[j-1]=0; b[j]=m+1; h[p].push(put(),h[1-p].f[k]+a[i][j]);} 70 continue; 71 } 72 if (i==n&&j==m) 73 { 74 if ((!x&&y)||(!y&&x)) 75 { 76 b[j]=b[j-1]=0; 77 h[p].push(put(),h[1-p].f[k]+a[i][j]); 78 } 79 continue; 80 } 81 if (x&&y) 82 { 83 if (x!=y) 84 { 85 b[j]=b[j-1]=0; 86 if (x!=y) 87 for (int r=0; r<=m; r++) if (b[r]==x) b[r]=y; 88 if (j==m) shift(); 89 h[p].push(put(),h[1-p].f[k]+a[i][j]); 90 } 91 } 92 else if ((x&&!y)||(!x&&y)) 93 { 94 int r=x+y; 95 if (j<m) { 96 b[j]=r; b[j-1]=0; 97 h[p].push(put(),h[1-p].f[k]+a[i][j]); 98 } 99 if (i<n) 100 { 101 b[j-1]=r; b[j]=0; 102 if (j==m) shift(); 103 h[p].push(put(),h[1-p].f[k]+a[i][j]); 104 } 105 } 106 else { 107 if (i<n&&j<m) 108 { 109 b[j]=b[j-1]=m+1; 110 h[p].push(put(),h[1-p].f[k]+a[i][j]); 111 } 112 b[j]=b[j-1]=0; 113 if (j==m) shift(); 114 h[p].push(put(),h[1-p].f[k]); 115 } 116 } 117 } 118 119 int main() 120 { 121 int tt=0; 122 while (scanf("%d%d",&n,&m)!=EOF) 123 { 124 for (int i=1; i<=n; i++) 125 for (int j=1; j<=m; j++) 126 scanf("%d",&a[i][j]); 127 if (n==1&&m==1) 128 { 129 printf("Case %d: %d\n",++tt,a[1][1]); 130 continue; 131 } 132 h[0].clr(); 133 h[0].push(0,0); p=0; 134 for (int i=1; i<=n; i++) 135 for (int j=1; j<=m; j++) 136 { 137 p^=1; h[p].clr(); 138 dp(i,j); 139 } 140 int ans=inf; 141 for (int i=1; i<=h[p].len; i++) 142 ans=max(ans,h[p].f[i]); 143 printf("Case %d: %d\n",++tt,ans); 144 } 145 return 0; 146 }
poj3133
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 const int maxl=1100010; 6 using namespace std; 7 struct node{ 8 int len,f[maxl],st[maxl]; 9 void clr() 10 { 11 for (int i=1; i<=len; i++) f[st[i]]=-1; 12 len=0; 13 } 14 void push(int nw,int s) 15 { 16 if (f[nw]==-1) 17 { 18 st[++len]=nw; 19 f[nw]=s; 20 } 21 else f[nw]=min(f[nw],s); 22 } 23 } h[2]; 24 int n,m,cas,p; 25 int a[15][15],b[15]; 26 27 void get(int st) 28 { 29 for (int i=m; i>=0; i--) 30 { 31 b[i]=st&3; 32 st>>=2; 33 } 34 } 35 36 int put() 37 { 38 int st=0; 39 for (int i=0; i<=m; i++) {st<<=2; st|=b[i];} 40 return st; 41 } 42 43 void shift() 44 { 45 for (int i=m;i; i--) b[i]=b[i-1]; 46 b[0]=0; 47 } 48 49 void dp(int i,int j) 50 { 51 for (int k=1; k<=h[1-p].len; k++) 52 { 53 get(h[1-p].st[k]); 54 int x=b[j],y=b[j-1],st=h[1-p].st[k]; 55 if (a[i][j]!=1) 56 { 57 if (!a[i][j]&&!x&&!y) h[p].push(st,h[1-p].f[st]); 58 else if (a[i][j]>1) 59 { 60 if (((x&&!y)||(!x&&y))&&(x+y==a[i][j])) {b[j]=b[j-1]=0; h[p].push(put(),h[1-p].f[st]+1);} 61 else if (!x&&!y) 62 { 63 if (a[i][j+1]==a[i][j]||a[i][j+1]==1) {b[j]=a[i][j]; b[j-1]=0; h[p].push(put(),h[1-p].f[st]+1);} 64 if (a[i+1][j]==a[i][j]||a[i+1][j]==1) {b[j-1]=a[i][j]; b[j]=0; h[p].push(put(),h[1-p].f[st]+1);} 65 } 66 } 67 continue; 68 } 69 if (x&&y&&x==y) {b[j]=b[j-1]=0; h[p].push(put(),h[1-p].f[st]+1);} 70 else if ((x&&!y)||(!x&&y)) 71 { 72 int r=x+y; 73 if (a[i][j+1]==1||a[i][j+1]==r) {b[j]=r; b[j-1]=0; h[p].push(put(),h[1-p].f[st]+1);} 74 if (a[i+1][j]==1||a[i+1][j]==r) {b[j-1]=r; b[j]=0; h[p].push(put(),h[1-p].f[st]+1);} 75 } 76 else if (!x&&!y) 77 { 78 if (a[i][j+1]&&a[i+1][j]) 79 { 80 if (a[i][j+1]==1&&a[i+1][j]==1) 81 { 82 b[j]=b[j-1]=2; h[p].push(put(),h[1-p].f[st]+1); 83 b[j]=b[j-1]=3; h[p].push(put(),h[1-p].f[st]+1); 84 } 85 else if (a[i][j+1]==2&&a[i+1][j]==1||a[i][j+1]==1&&a[i+1][j]==2||a[i+1][j]==2&&a[i][j+1]==2) {b[j]=b[j-1]=2; h[p].push(put(),h[1-p].f[st]+1);} 86 else if (a[i][j+1]==3&&a[i+1][j]==1||a[i][j+1]==1&&a[i+1][j]==3||a[i+1][j]==3&&a[i][j+1]==3) {b[j]=b[j-1]=3; h[p].push(put(),h[1-p].f[st]+1);} 87 } 88 h[p].push(st,h[1-p].f[st]); 89 } 90 } 91 } 92 93 int main() 94 { 95 h[1].len=h[0].len=0; 96 memset(h[0].f,255,sizeof(h[0].f)); 97 memset(h[1].f,255,sizeof(h[1].f)); 98 scanf("%d%d",&n,&m); 99 while (n&&m) 100 { 101 memset(a,0,sizeof(a)); 102 for (int i=1; i<=n; i++) 103 { 104 for (int j=1; j<=m; j++) 105 { 106 scanf("%d",&a[i][j]); 107 if (a[i][j]==0||a[i][j]==1) a[i][j]^=1; 108 } 109 } 110 h[0].push(0,0); p=0; 111 for (int i=1; i<=n; i++) 112 { 113 p^=1; h[p].clr(); 114 for (int k=1; k<=h[1-p].len; k++) 115 { 116 get(h[1-p].st[k]); int st=h[1-p].st[k]; shift(); 117 h[p].push(put(),h[1-p].f[st]); 118 } 119 for (int j=1; j<=m; j++) 120 { 121 p^=1; h[p].clr(); 122 dp(i,j); 123 } 124 } 125 int ans=0; 126 for (int i=1; i<=h[p].len; i++) 127 { 128 int st=h[p].st[i]; 129 ans+=h[p].f[st]; 130 } 131 if (ans>0) ans-=2; 132 printf("%d\n",ans); 133 h[1].clr(); h[0].clr(); 134 scanf("%d%d",&n,&m); 135 } 136 return 0; 137 }
hdu4285
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 typedef long long ll; 5 const int ha=30007; 6 const int maxl=300010; 7 const int mo=1000000007; 8 using namespace std; 9 struct node{ 10 int p[ha],nex[maxl],len,f[maxl]; 11 ll st[maxl]; 12 void clr() 13 { 14 len=0; memset(p,255,sizeof(p)); 15 } 16 void push(ll nw,int s) 17 { 18 int x=nw%ha; 19 for (int i=p[x];i!=-1; i=nex[i]) 20 if (st[i]==nw) 21 { 22 f[i]=(f[i]+s)%mo; 23 return; 24 } 25 st[++len]=nw; f[len]=s; 26 nex[len]=p[x]; p[x]=len; 27 } 28 } h[2]; 29 int n,m,cas,p,t; 30 int a[15][15],b[15],v[15]; 31 32 void get(ll st) 33 { 34 b[m+1]=st&63; st>>=6; 35 for (int i=m; i>=0; i--) 36 { 37 b[i]=st&7; 38 st>>=3; 39 } 40 } 41 42 ll put() 43 { 44 memset(v,255,sizeof(v)); v[0]=0; 45 ll st=0; int t=0; 46 for (int i=0; i<=m; i++) 47 { 48 if (v[b[i]]==-1) v[b[i]]=++t; 49 b[i]=v[b[i]]; 50 st<<=3; st|=b[i]; 51 } 52 st<<=6; st|=b[m+1]; 53 return st; 54 } 55 56 void shift() 57 { 58 for (int i=m;i; i--) b[i]=b[i-1]; 59 b[0]=0; 60 } 61 62 bool check(int j) 63 { 64 bool ff=1; 65 for (int i=0; i<j-1; i++) 66 if (b[i]) ff^=1; 67 if (!ff) return 0; 68 for (int i=j+1; i<=m; i++) 69 if (b[i]) ff^=1; 70 return ff; 71 } 72 73 void dp(int i,int j) 74 { 75 for (int k=1; k<=h[p^1].len; k++) 76 { 77 get(h[p^1].st[k]); 78 if (!a[i][j]) 79 { 80 b[j]=b[j-1]=0; 81 h[p].push(put(),h[p^1].f[k]); 82 continue; 83 } 84 int x=b[j],y=b[j-1]; 85 if (b[m+1]==t) continue; 86 if (x&&y) 87 { 88 b[j]=b[j-1]=0; 89 if (x!=y){ 90 for (int r=0; r<=m; r++) if (b[r]==x) b[r]=y; 91 } 92 else { 93 if (check(j)) ++b[m+1]; else continue; 94 } 95 h[p].push(put(),h[p^1].f[k]); 96 } 97 else if ((x&&!y)||(!x&&y)) 98 { 99 int r=x+y; 100 if (a[i][j+1]) 101 { 102 b[j]=r; b[j-1]=0; 103 h[p].push(put(),h[p^1].f[k]); 104 } 105 if (a[i+1][j]) 106 { 107 b[j-1]=r; b[j]=0; 108 h[p].push(put(),h[p^1].f[k]); 109 } 110 } 111 else { 112 if (a[i][j+1]&&a[i+1][j]) 113 { 114 b[j]=b[j-1]=m+1; 115 h[p].push(put(),h[p^1].f[k]); 116 } 117 } 118 } 119 } 120 121 int main() 122 { 123 char s[15]; int cas; 124 scanf("%d",&cas); 125 while (cas--) 126 { 127 scanf("%d%d%d",&n,&m,&t); 128 memset(a,0,sizeof(a)); 129 for (int i=1; i<=n; i++) 130 { 131 scanf("%s",s+1); 132 for (int j=1; j<=m; j++) 133 if (s[j]==‘.‘) a[i][j]=1; 134 } 135 h[0].clr(); 136 h[0].push(0,1); p=0; 137 for (int i=1; i<=n; i++) 138 { 139 p^=1; h[p].clr(); 140 for (int k=1; k<=h[p^1].len; k++) 141 { 142 get(h[p^1].st[k]); shift(); 143 h[p].push(put(),h[p^1].f[k]); 144 } 145 for (int j=1; j<=m; j++) 146 { 147 p^=1; h[p].clr(); 148 dp(i,j); 149 } 150 } 151 int ans=0; 152 for (int i=1; i<=h[p].len; i++) 153 { 154 get(h[p].st[i]); 155 if (b[m+1]==t) ans=(ans+h[p].f[i])%mo; 156 } 157 printf("%d\n",ans); 158 } 159 return 0; 160 }
矩阵乘法加速插头dp的几题一直想做,抽时间要补一下
初探插头dp
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。