1. 程式人生 > >AtCoder Beginner Contest 122 D - We Like AGC(DP)

AtCoder Beginner Contest 122 D - We Like AGC(DP)

tdi display 鏈接 ner abc like 分享圖片 logs hide

題目鏈接

思路自西瓜and大佬博客:https://www.cnblogs.com/henry-1202/p/10590327.html#_label3

數據範圍小 可直接dp

f[i][j][a][b] 表示 i位置上是j i-1上是a i-2上是b

狀態轉移是由i-1轉移過來的,所以就必須還要一個i-3 所以就多加上一個循環

最主要就是轉移過程中要枚舉每種情況 然後排除掉

大佬的博客用了map和string簡化了枚舉的過程

不過他說只有六種情況 我布吉島為啥只有六種 我寫出了八種qaq

技術分享圖片
map<int, string> mp;
bool check(int a, int
b, int c, int d) { if (mp[a] + mp[b] + mp[c] == "AGC") return 0; if (mp[a] + mp[c] + mp[b] == "AGC") return 0; if (mp[a] + mp[b] + mp[d] == "AGC") return 0; if (mp[a] + mp[c] + mp[d] == "AGC") return 0; if (mp[b] + mp[a] + mp[c] == "AGC") return 0; if (mp[b] + mp[c] + mp[d] == "
AGC") return 0; if (mp[b] + mp[d] + mp[c] == "AGC") return 0; if (mp[c] + mp[b] + mp[d] == "AGC") return 0; return 1; }
View Code

mp[0]=‘E‘就是來處理剛開始未到3個字符時候的情況 不過枚舉j也就是第i個位置的字符就從1開始了 所以之後的不會受到mp[0]的影響了

技術分享圖片
#include <cstdio>
#include <algorithm>
#include <string>
#include 
<map> using namespace std; map<int, string> mp; long long f[110][5][5][5]; const long long mod = 1e9 + 7; bool check(int a, int b, int c, int d) { if (mp[a] + mp[b] + mp[c] == "AGC") return 0; if (mp[a] + mp[c] + mp[b] == "AGC") return 0; if (mp[a] + mp[b] + mp[d] == "AGC") return 0; if (mp[a] + mp[c] + mp[d] == "AGC") return 0; if (mp[b] + mp[a] + mp[c] == "AGC") return 0; if (mp[b] + mp[c] + mp[d] == "AGC") return 0; if (mp[b] + mp[d] + mp[c] == "AGC") return 0; if (mp[c] + mp[b] + mp[d] == "AGC") return 0; return 1; } int main() { int n; scanf("%d", &n); f[0][0][0][0] = 1; mp[0] = E, mp[1] = A, mp[2] = C, mp[3] = G, mp[4] = T; for (int i = 1; i <= n; i++) for (int j = 1; j <= 4; j++) for (int a = 0; a <= 4; a++) for (int b = 0; b <= 4; b++) for (int l = 0; l <= 4; l++) if (check(l, b, a, j)) f[i][j][a][b] = (f[i][j][a][b] + f[i-1][a][b][l]) % mod; long long ans = 0; for (int i = 1; i <= 4; i++) for (int j = 1; j <= 4; j++) for (int k = 1; k <= 4; k++) ans = (ans + f[n][i][j][k]) % mod; printf("%lld\n", ans); return 0; }
View Code

AtCoder Beginner Contest 122 D - We Like AGC(DP)