제목 링크 : HTTPS : //codeforces.com/problemset/problem/1051/D
제목 효과 :
길이 n의 그리드의 두 행은 각 격자는 흰색 또는 검은 색 페인트 할 수있다. 동색 인접하고 두 격자들은 동일한 차이나 유니콤 블록에 속하는 경우. 지금 당신에게 어떻게 색상 표시 체계 유니콤 블록 = K 모드 = 998,244,353 많은.
아이디어 :
는 I 번째 행은 제 i-1 번째 행의 상태에 관한 것이다. F를 [I]은 [J]를 [K] : 선택된 블록 i 행의 j 번째의 링크를 나타낸다. 가장 오른쪽에있는 상태 k는 프로그램의 수, 거기에 직접 DP입니다.
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int mod = 998244353;
LL f[1005][2005][4]={0};
int main()
{
int n, k;
scanf("%d%d", &n, &k);
f[1][2][0]=1;
f[1][2][1]=1;
f[1][1][2]=1;
f[1][1][3]=1;
for(int i=2; i<=n; i++){
for(int j=1; j<=k; j++){
for(int k=0; k<4; k++){
if(k==0){
f[i][j][k]+=f[i-1][j][0];
f[i][j][k]+=f[i-1][j-2][1];
f[i][j][k]+=f[i-1][j-1][2];
f[i][j][k]+=f[i-1][j-1][3];
}
if(k==1){
f[i][j][k]+=f[i-1][j][1];
f[i][j][k]+=f[i-1][j-2][0];
f[i][j][k]+=f[i-1][j-1][2];
f[i][j][k]+=f[i-1][j-1][3];
}
if(k==2){
f[i][j][k]+=f[i-1][j][0];
f[i][j][k]+=f[i-1][j][1];
f[i][j][k]+=f[i-1][j][2];
f[i][j][k]+=f[i-1][j-1][3];
}
if(k==3){
f[i][j][k]+=f[i-1][j][0];
f[i][j][k]+=f[i-1][j][1];
f[i][j][k]+=f[i-1][j][3];
f[i][j][k]+=f[i-1][j-1][2];
}
f[i][j][k]%=mod;
}
}
}
LL ans=0;
for(int i=0; i<4; i++){
ans+=f[n][k][i];
}
printf("%lld\n", ans%mod);
return 0;
}