BZOJ2331 [SCOI2011]地板

来源:互联网 发布:淘宝导入别人宝贝 编辑:程序博客网 时间:2024/04/26 03:15

这鬼题……考虑一下插头DP,3种插头,分别表示拐弯了,没拐弯和没插头,逐个转移轮廓线DP一下即可,复杂度3^min(n,m)*nm

不知道为什么他们跑的都那么快,我卡了半天常数还是这么慢。

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<algorithm>#include<iomanip>#include<cmath>#include<vector>#include<queue>#include<stack>#include<bitset>#include<set>#include<map>using namespace std;#define MAXN 110#define MAXM 180010#define INF 1000000000#define eps 1e-8#define MOD 20110520#define ll long longint n,m;char mp[MAXN][MAXN];int f[MAXM],g[MAXM];int mi[MAXN];int N;int w(int x,int y){return x/mi[y]%3;}int s(int x,int y,int z){return x-w(x,y)*mi[y]+z*mi[y];}int main(){int i,j,k,x,y;mi[0]=1;for(i=1;i<=11;i++){mi[i]=mi[i-1]*3;}scanf("%d%d",&n,&m);for(i=1;i<=n;i++){scanf("%s",mp[i]+1);}if(n<m){for(i=1;i<=n;i++){for(j=i;j<=m;j++){swap(mp[i][j],mp[j][i]);}}swap(n,m);}f[0]=1;N=mi[m+1];for(i=1;i<=n;i++){for(j=1;j<=m;j++){memset(g,0,sizeof(g));if(mp[i][j]=='*'){for(k=0;k<N;k++){if(!w(k,j-1)&&!w(k,j)){g[k]+=f[k];}}}else{for(k=0;k<N;k++){if(!f[k]){continue ;}x=w(k,j-1);y=w(k,j);if(x==0&&y==0){(g[s(s(k,j-1,1),j,0)]+=f[k])%=MOD;(g[s(s(k,j-1,0),j,1)]+=f[k])%=MOD;(g[s(s(k,j-1,2),j,2)]+=f[k])%=MOD;}if(x==0&&y==1){(g[s(s(k,j-1,1),j,0)]+=f[k])%=MOD;(g[s(s(k,j-1,0),j,2)]+=f[k])%=MOD;}if(x==0&&y==2){(g[s(s(k,j-1,0),j,0)]+=f[k])%=MOD;(g[s(s(k,j-1,2),j,0)]+=f[k])%=MOD;}if(x==1&&y==0){(g[s(s(k,j-1,0),j,1)]+=f[k])%=MOD;(g[s(s(k,j-1,2),j,0)]+=f[k])%=MOD;}if(x==1&&y==1){(g[s(s(k,j-1,0),j,0)]+=f[k])%=MOD;}if(x==2&&y==0){(g[s(s(k,j-1,0),j,2)]+=f[k])%=MOD;(g[s(s(k,j-1,0),j,0)]+=f[k])%=MOD;}}}memcpy(f,g,sizeof(f));}memset(g,0,sizeof(g));for(k=0;k<mi[m];k++){g[k*3]=f[k];}memcpy(f,g,sizeof(f));}printf("%d\n",f[0]);return 0;}/**/


0 0
原创粉丝点击