题意:
有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;
}