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;
}

posted @ 2018-09-28 17:18  ChunhaoMo  阅读(207)  评论(0)    收藏  举报