您的位置:首页 > 其它

JOJ 2474:Tile My Corridor 平铺棋盘 状态压缩解法

2011-10-07 19:22 253 查看
dfs找状态没找明白 , 直接手写的状态转移 , 反正就2^2的情况。

#include <cstdio>
#include <cstring>

/*
const int mod=2008;
int f[106];
int main ()
{
f[0]=1; f[1]=2; f[2]=11 ; f[3]=7*f[1]+2*f[2]+2;
f[4]=f[3]*2+f[2]*7+f[1]*6+f[0]*2;
for (int i=5 ; i<105 ; ++i)
{
f[i]=(f[i-1]*2+f[i-2]*7+f[i-3]*6+f[i-4]*2+f[i-5]*2)%mod;
}
int n;
while (scanf("%d",&n),n)
{
printf("%d\n",f
);
}
return 0;
}
*/

const int mod=2008;
int dp[105][4];
/*
void dfs(int r , int c , int sta , int pre)
{
if(c>=2)
{
if(c==2)dp[r][sta]=(dp[r][sta]+dp[r-1][pre])%mod;
return;
}
dfs(r , c+1 , sta<<1 , pre<<1|1);//no plant
dfs(r , c+1 , sta<<1|1 , pre<<1|1);//1
if(c==0)dfs(r , c+1 , 1 , 0);//1+4
if(c==1 && sta==1 && pre==0)dfs(r , c+1 , 3 , 0);
dfs(r , c+2 , sta<<2|3 , pre<<2|3);//2.
if(c==0)dfs(r , c+1 , sta<<1|1 , pre<<1);//3
if(c==1 && pre==1)dfs(r , c+1 , sta<<1|1 , 2);
if(c==1 && sta==0) dfs(r , c+1 , 1 , 0);//4
if(c==0) dfs(r , c+2 , 3 , 1);//5
if(c==0) dfs(r , c+2 , 3 , 2);//6
if(c==0) dfs(r , c+2 , 2 , 0);//7
}
*/
int main ()
{
int n;
while (scanf("%d",&n) , n)
{
memset (dp , 0 , sizeof(dp));
dp[1][0]=1;dp[1][1]=1;dp[1][2]=1;dp[1][3]=2;
//for (int i=2 ; i<=n ; ++i)
//  dfs(i , 0 , 0 , 0);
for (int i=2 ; i<=n ; ++i)
{
dp[i][0]=(dp[i][0]+dp[i-1][3])%mod;//no
dp[i][2]=(dp[i][2]+dp[i-1][3])%mod;//1
dp[i][1]=(dp[i][1]+dp[i-1][3])%mod;//1
dp[i][3]=(dp[i][3]+dp[i-1][3])%mod;//1+1
dp[i][3]=(dp[i][3]+dp[i-1][3])%mod;//2
dp[i][1]=(dp[i][1]+dp[i-1][2])%mod;//3
dp[i][2]=(dp[i][2]+dp[i-1][1])%mod;//3
dp[i][3]=(dp[i][3]+dp[i-1][0])%mod;//3+3
dp[i][3]=(dp[i][3]+dp[i-1][1])%mod;//3+1
dp[i][3]=(dp[i][3]+dp[i-1][2])%mod;//3+1
dp[i][1]=(dp[i][1]+dp[i-1][0])%mod;//4
dp[i][3]=(dp[i][3]+dp[i-1][0])%mod;//4+1
dp[i][2]=(dp[i][2]+dp[i-1][0])%mod;//5
dp[i][3]=(dp[i][3]+dp[i-1][0])%mod;//5+1
dp[i][3]=(dp[i][3]+dp[i-1][1])%mod;//6
dp[i][3]=(dp[i][3]+dp[i-1][2])%mod;//7
}
printf("%d\n" , dp
[3]%mod);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: