hdu1176 kuangbin dp專題
阿新 • • 發佈:2018-11-13
思路:對於dp之類的題來說最重要的就是轉移方程的建立吧,在這道題中我們可以得知人要想到達x點,他只能從x+1處,x-1處或者x處原地不動來到達,那麼轉移方程也就同樣建立起來,唯一需要注意的一點大概就是對於0和10這兩個臨界點的處理。
程式碼:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 1e5 + 10; int num[maxn][11]; int dp[maxn][11];//dp[I][j]表示的是第I秒到達j點時的所裝的餡餅數 int main() { int n; while (scanf("%d", &n) && n) { int mx = 0; memset(dp, 0, sizeof(dp)); memset(num, 0, sizeof(num)); for(int i=0;i<n;i++) { int a, t; scanf("%d %d", &a, &t); if (t == 1 && (a == 4 || a == 6||a==5)) dp[1][a]++; num[t][a]++; mx = mx > t ? mx : t; } for (int i = 2; i <=mx; i++) { for (int j = 0; j < 11; j++) { if (j == 0) dp[i][j] = max(dp[i - 1][0], dp[i - 1][1]) + num[i][0]; else if (j == 10) dp[i][10] = max(dp[i - 1][10], dp[i - 1][9]) + num[i][10]; else dp[i][j] = max(dp[i - 1][j - 1], max(dp[i - 1][j], dp[i - 1][j + 1])) + num[i][j]; } } int mt = 0; for (int i = 0; i < 11; i++) mt = mt > dp[mx][i] ? mt : dp[mx][i]; printf("%d\n", mt); } //system("pause"); return 0; }