1. 程式人生 > >CodeForces - 1051D Bicolorings(DP)

CodeForces - 1051D Bicolorings(DP)

log www. sed event style pan 狀態 ngs color

題目鏈接:http://codeforces.com/problemset/problem/1051/D

看了大佬的題解後覺著是簡單的dp,咋自己做就做不來呢。

大佬的題解:https://www.cnblogs.com/tobyw/p/9685639.html

剛看的時候有點感覺 狀態肯定是(i,k) 但是這個狀態不具備無後效性 會受到i-1兩個格子啥顏色的影響 然後就沒往下想了qwq

大佬用了二進制來表示這兩格的狀態

現在的狀態就是(i, k, color) color有4種可能 0,0 1,1 0,1 1,0

狀態轉移方程就很自然了

dp[i][k][0] = dp[i-1][k][0] + dp[i-1][k][1] +dp[i-1][k][2] + dp[i-1][k-1][3]

dp[i][k][1] = dp[i-1][k-1][0] +dp[i-1][k][1] + dp[i-1][k-2][2] +dp[i-1][k-1][3]
dp[i][k][2] = dp[i-1][k-1][0] + dp[i-1][k-2][1] + dp[i-1][k][2] +dp[i-1][k-1][3]
dp[i][k][3] = (dp[i-1][k-1][0] + dp[i-1][k][1] +dp[i-1][k][2] + dp[i-1][k][3]

代碼如下

技術分享圖片
#include <cstdio>
#include <algorithm>
#define
ll long long #define MOD 998244353 using namespace std; const int maxn = 1010; ll dp[maxn][maxn<<1][4]; int main(int argc, char const *argv[]) { int n, kl; scanf("%d%d", &n, &kl); dp[1][1][0] = 1; dp[1][2][1] = dp[1][2][2] = 1; dp[1][1][3] = 1; for
(int i = 2; i <= n; i++) { for (int k = 1; k <= (i << 1); k++) { dp[i][k][0] = (dp[i-1][k][0] + dp[i-1][k][1] + dp[i-1][k][2] + dp[i-1][k-1][3]) % MOD; dp[i][k][1] = (dp[i-1][k-1][0] + dp[i-1][k][1] + dp[i-1][k-2][2] + dp[i-1][k-1][3]) % MOD; dp[i][k][2] = (dp[i-1][k-1][0] + dp[i-1][k-2][1] + dp[i-1][k][2] + dp[i-1][k-1][3]) % MOD; dp[i][k][3] = (dp[i-1][k-1][0] + dp[i-1][k][1] + dp[i-1][k][2] + dp[i-1][k][3]) % MOD; } } printf("%lld\n", (dp[n][kl][0] + dp[n][kl][1] + dp[n][kl][2] + dp[n][kl][3]) % MOD); return 0; }
View Code

CodeForces - 1051D Bicolorings(DP)