D. Bicolorings

传送门
[http://codeforces.com/contest/1051/problem/D]

题意

相当于有个2列n行得棋盘,棋盘上的格子只能是黑或者白,问你联通块为k得方案数有多少,结果对
998244353取余

分析

三维dp下去,具体看图及代码

分析图

代码

#include <stdio.h>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll dp[1001][2001][4]; 
int main()
{
    int n,k1;
    int i,j,k;
        memset(dp,0,sizeof(dp));
        
        dp[1][1][0]=1;
        dp[1][2][1]=1;
        dp[1][2][2]=1;
        dp[1][1][3]=1;
        
        for(i=2;i<1001;i++)
        {
            for(j=1;j<2001;j++)
            {
                for(k=0;k<4;k++)
                {
                    if(k==0)
                    {
                        dp[i][j][k]=dp[i-1][j][0]+dp[i-1][j][1]+dp[i-1][j][2]+dp[i-1][j-1][3];
                    }
                    
                    if(k==1)
                    {
                        dp[i][j][k]=dp[i-1][j-1][0]+dp[i-1][j][1]+dp[i-1][j-2][2]+dp[i-1][j-1][3];
                    }
                    
                    if(k==2)
                    {
                        dp[i][j][k]=dp[i-1][j-1][0]+dp[i-1][j-2][1]+dp[i-1][j][2]+dp[i-1][j-1][3];
                    }
                    if(k==3)
                    {
                        dp[i][j][k]=dp[i-1][j-1][0]+dp[i-1][j][1]+dp[i-1][j][2]+dp[i-1][j][3];
                    }
                    dp[i][j][k]%=998244353;
                } 
            }
        }
    while(scanf("%d %d",&n,&k1)!=EOF)
    {       
            printf("%I64d\n",(dp[n][k1][0]+dp[n][k1][1]+dp[n][k1][2]+dp[n][k1][3])%998244353);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/mch5201314/p/9719790.html