컬러 블록 codeforces 상태 카운트 DP로 1051 D. Bicolorings 두 줄

제목 링크 : 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;
}
게시 된 374 개 원래 기사 · 원 찬양 22 ·은 20000 +를 볼

추천

출처blog.csdn.net/qq_21433411/article/details/103190445