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

猜你喜欢

转载自www.cnblogs.com/VIrtu0s0/p/9985136.html