HDU 1176 免费馅饼 dp
这题一开始看不知如何dp,看了别人的解题报告才知道是数塔的变形
dp[i][j] 表示从i~n秒第j个位置获得的最多馅饼数
dp[i][j] = max (dp[i][j], dp[i+1][j-1], dp[i+1][j], dp[i+1][j+1])
#include<iostream> #define MAX 100005 using namespace std; int dp[MAX][12]; int main() { int n; int x, t; int max_t; while (cin >> n && n) { max_t = 0; memset(dp, 0, sizeof(dp)); for(int i = 0; i < n; i++) { cin >> x >> t; dp[t][x]++; max_t = max(t, max_t); } for (int i = max_t-1; i >= 0; i--) { for (int j = 0; j < 11; j++) { int hold = dp[i][j]; for (int k = -1; k < 2; k++) if (j+k >= 0 && j+k < 11) dp[i][j] = max(dp[i][j], dp[i+1][j+k]+hold); } } cout << dp[0][5] << endl; } return 0; }