poj 2663 (轮廓线dp)

来源:互联网 发布:淘宝客怎么加群 编辑:程序博客网 时间:2024/05/02 03:03
int main()
{
    int cur,n,i,j,k,m;
    int dp[2][35];
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
        {
            puts("1");continue;
        }
        if(n==1)
        {
            puts("0");continue;
        }
        if(n==-1)
            break;
        m=3;
        memset(dp,0,sizeof(dp));
        cur=0;
        dp[cur][(1<<m)-1]=1;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                cur=1-cur;
                memset(dp[cur],0,sizeof(dp[cur]));
                for(k=0;k<(1<<m);k++)
                {
                    if(k&(1<<(m-1)))//不放,上层必须为1才允许不放
                        dp[cur][(k<<1)^(1<<m)]+=dp[1-cur][k];//km-1 k3 k2 k1 0
                    if(i!=1&&!(k&(1<<(m-1))))//上放,i不能是顶层,且上层必须没放
                        dp[cur][(k<<1)+1]+=dp[1-cur][k];
                    if(j!=1&&!(k&1)&&(k&(1<<(m-1))))//左放,低位必须为0,高位必须为1
                        dp[cur][(k<<1)^3^(1<<m)]+=dp[1-cur][k];
                }
            }
        }
        printf("%d\n",dp[cur][(1<<m)-1]);
    }
    return 0;
}
0 0
原创粉丝点击