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

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[n]);
    }
    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[n][3]%mod);
    }
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值