[HDU 5965]掃雷 【簡單動態規劃】
阿新 • • 發佈:2019-02-14
一道簡單的動態規劃。每一列所需要放置的地雷個數能被上一列地雷的個數所確定(為什麼不說是前兩列?)並列舉第一列的所有情況,然後計算。不想妥協討論i=1,2時的情況,並且想讓動規陣列第一個元素為pc[0],故賦予pc[i]特殊的含義:下一列(第i+2列)替當前列至少要放的地雷個數。tp為一般思路中的dp[i](當前第i+1列所需要放置的地雷個數)。
注意,既然是對後繼元素的動規條件,故應對pc[n-1](最後一個元素)進行討論。另一個關鍵點是應用tp作為當前迴圈是否合法的條件——而不是pc[i](為什麼?)
注:化簡後可得pc[i]=dp[i+1],dp[i]同上
下面是題解
#include <cstdio> #include <cstdlib> #include <memory> #include <cstring> const int MAXN = 10010; const int P = 1e8+7; int main(void) { int T; scanf("%d",&T); while (T--) { char num[MAXN]; int sum = 0, n = 0, pc[MAXN]; scanf("%s", &num); n = strlen(num); for (int i = 0; i <= num[0] - '0'&&i < 3; i++) { memset(pc, 0, sizeof pc); int t = 1; if (i == 1) t++; int tp = i; pc[0] = num[0] - '0' - i; for (int j = 1; j < n; j++) { pc[j] = num[j] - '0' - pc[j - 1] - tp; tp = pc[j - 1]; if (tp == 1) { t *= 2; t %= P; } if (tp < 0 || tp>2) { t = 0; break; } } if (pc[n - 1]!=0) continue; sum += t; sum %= P; } printf("%d\n", sum); } return 0; }