题意:
有n块饼,第t秒会落在x上,起点位于x = 5,每次只能移动±1步,求最多能得到饼的数目
分析:
第t秒时,任意位置x最终的最大饼数,只与下一秒时,三个可达点x-1,x,x+1的最大饼数相关
状态:dp[t][x] 表示在x位置时,从t秒到max_time秒的时候,最大收获的饼数
转移方程:
dp[t][x] = max(dp[t+1][x], max(dp[t+1][x-1], dp[t+1][x+1])) + v[i][j];
核心:
for(i = max_time; i>=0; i--) { for(j = 1; j<=maxt_X; j++) { dp[i][j] = max(dp[i+1][j], max(dp[i+1][j-1], dp[i+1][j+1])) + v[i][j]; } }
代码:
#include <stdio.h> #include <iostream> #include <string.h> #include <string> #include <math.h> #include <algorithm> #include <queue> #include <stack> #include <map> #include <vector> #include <time.h> using namespace std; int v[100000+10][10+10]; int dp[100000+10][10+10]; int main() { //freopen("a.txt", "r", stdin); int n, i, j, x1, t1, max_time, max_X = 11 + 1; while(~scanf("%d", &n) && n) { max_time = 0; memset(v, 0, sizeof(v)); memset(dp, 0, sizeof(dp)); for(i = 1; i<=n; i++) { scanf("%d%d", &x1, &t1); x1 += 1; v[t1][x1] ++; max_time= max(max_time, t1); } for(i = max_time; i>=0; i--) { for(j = 1; j<=max_X; j++) { dp[i][j] = max(dp[i+1][j], max(dp[i+1][j-1], dp[i+1][j+1])) + v[i][j]; } } printf("%d\n", dp[0][5+1]); } return 0; }