DP 免費餡餅 HDU1176
阿新 • • 發佈:2018-12-26
DP 免費餡餅 HDU1176
一道基本的DP題,狀態轉移很好想,每一個狀態的位置\(pos\)都只能由上一秒的\(pos-1, pos, pos+1\)三個位置轉移而來(當然要判斷邊界情況),這種簡單的轉移就直接寫程式碼寫死就行了,不需要像其他DP,還需要一個迴圈來專門決策。另外,這種DP寫法還有點技巧,即是從最後一秒向前倒著推的,最後答案直接就是dp[0][5]
(注意不是dp[1][5]
)的值,不需要再迴圈判斷一次。
AC 62ms Code:
#include <cstdio> #include <cstring> #define MAX(A,B) ((A)>(B)?(A):(B)) using namespace std; int dp[100005][15]; int n; int main() { while(scanf("%d", &n), n!=0){ memset(dp, 0, sizeof(dp)); int cnt=0; for(register int i=0;i<n;i++){ int x,t;scanf("%d %d", &x, &t); ++dp[t][x]; //直接在dp[][]裡面操作,節約了一個a[][]費用陣列 cnt=MAX(cnt, t); } for(register int i=cnt;i>=0;--i) for(register int j=0;j<=10;++j){ if(j==0) //邊界判斷 dp[i][j]+=MAX(dp[i+1][j], dp[i+1][j+1]); else if(j==10) dp[i][j]+=MAX(dp[i+1][j], dp[i+1][j-1]); else dp[i][j]+=MAX(dp[i+1][j], MAX(dp[i+1][j-1], dp[i+1][j+1])); } printf("%d\n", dp[0][5]); //最終狀態即dp[0][5] } return 0; }