2018.09.21 codeforces1051D. Bicolorings(線性dp)
阿新 • • 發佈:2018-12-11
傳送門 sb線性DP。 表示前i列j個連通塊且第i列狀態為00/01/10/11時的方案總數。 這個顯然可以輕鬆轉移。 舉例: 其它幾個同理。 程式碼:
#include<bits/stdc++.h> #define mod 998244353 #define ll long long #define N 1005 using namespace std; inline long long read(){ long long ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar(); return ans; } int n,k; ll f[N][N*2][4]; int main(){ cin>>n>>k; f[1][1][0]=1; f[1][1][3]=1; f[1][2][1]=1; f[1][2][2]=1; for(int i=2;i<=n;++i){ int up=min(i*2,k); for(int j=1;j<=up;++j){ f[i][j][0]=(f[i-1][j][0]+f[i-1][j][1]+f[i-1][j][2]+f[i-1][j-1][3])%mod; f[i][j][1]=(f[i-1][j-1][0]+f[i-1][j][1]+f[i-1][j-1][3])%mod; if(j>=2)(f[i][j][1]+=f[i-1][j-2][2])%=mod; f[i][j][2]=(f[i-1][j-1][0]+f[i-1][j][2]+f[i-1][j-1][3])%mod; if(j>=2)(f[i][j][2]+=f[i-1][j-2][1])%=mod; f[i][j][3]=(f[i-1][j-1][0]+f[i-1][j][1]+f[i-1][j][2]+f[i-1][j][3])%mod; } } cout<<(f[n][k][0]+f[n][k][1]+f[n][k][2]+f[n][k][3])%mod; return 0; }