1. 程式人生 > >Educational Codeforces Round 51 D. Bicolorings(dp)

Educational Codeforces Round 51 D. Bicolorings(dp)

https://codeforces.com/contest/1051/problem/D

題意

一個2*n的矩陣,你可以用黑白格子去填充他,求聯通塊數目等於k的方案數,答案%998244353.

思路

  • 按列dp,定義狀態dp[i][j][k]為前i列,有j個聯通塊,最後一列為k的方案數
  • 處理出列狀態之間的轉移(會新產生多少個新的聯通塊)
  • 注意初始化問題
#include<bits/stdc++.h>
#define P 998244353
#define ll long long
using namespace std;
int g[5][5];
ll f[1005][2005][5];
int i,j,n,m,p,q;
ll ans;
int main(){
    cin>>n>>m;
    g[1][2]=g[2][1]=2;
    g[0][3]=g[3][0]=g[0][1]=g[0][2]=g[3][1]=g[3][2]=1;
    f[1][2][1]=f[1][2][2]=f[1][1][0]=f[1][1][3]=1;
    for(i=2;i<=n;i++)for(j=1;j<=m;j++)for(p=0;p<4;p++)for(q=0;q<4;q++)
        if(j>g[p][q]) f[i][j][q]=(f[i][j][q]+f[i-1][j-g[p][q]][p])%P;
    ans=0;
    for(i=0;i<4;i++)ans=(ans+f[n][m][i])%P;
    cout<<ans;
}