Codeforces #511 div2 D. Bicolorings(dp)
阿新 • • 發佈:2018-12-11
類似狀壓dp的思路吧,只有兩行,所以每一列只有4個狀態,所以可以考慮列舉每一列,這樣複雜度是On*4,n只有1000,題目又要求把方格分成k個連通塊,我們在dp中再加一維即可,k最大是2*n的,所以最多做8e6次迴圈。
#include<bits/stdc++.h> using namespace std; const int mod=998244353; long long dp[5][1100][2100]; int main() { int n,k; cin>>n>>k; memset(dp,0,sizeof(dp)); dp[0][1][1]=1; dp[1][1][1]=0; dp[2][1][1]=0; dp[3][1][1]=1; dp[0][1][2]=0; dp[1][1][2]=1; dp[2][1][2]=1; dp[3][1][2]=0; for(int j=2; j<=n; j++) for(int i=0; i<=3; i++) for(int t=1; t<=k; t++) { if(i==0) dp[i][j][t]=(dp[0][j-1][t]+dp[1][j-1][t]+dp[2][j-1][t]+dp[3][j-1][t-1])%mod; else if(i==1) dp[i][j][t]=(dp[0][j-1][t-1]+dp[1][j-1][t]+dp[2][j-1][t-2]+dp[3][j-1][t-1])%mod; else if(i==2) dp[i][j][t]=(dp[0][j-1][t-1]+dp[1][j-1][t-2]+dp[2][j-1][t]+dp[3][j-1][t-1])%mod; else dp[i][j][t]=(dp[0][j-1][t-1]+dp[1][j-1][t]+dp[2][j-1][t]+dp[3][j-1][t])%mod; } cout<<(dp[0][n][k]+dp[1][n][k]+dp[2][n][k]+dp[3][n][k])%mod<<endl; }