题目:
![](https://i-blog.csdnimg.cn/blog_migrate/3d6e7172eea0b64638702b3468ac5ad2.jpeg)
为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)
提示:本题的输入数据量比较大,建议用scanf读入,用cin可能会超时。
6 5 1 4 1 6 1 7 2 7 2 8 3 0
4
初始时gameboy在5位置,可以在0-10这11个位置上接馅饼,每秒钟只能移动一个位置。向左或者向右。给出某一个位置落下馅饼的时间,求gameboy最多能接到多少馅饼。
解题思路:
初始时的思路就是将时间和馅饼放在二维数组里。
从最后面往前dp,最后的结果取dp[6][0];
因为第一秒在5位置,第二秒可以在456位置,第三秒可以在34567位置,依次类推得:
…………
2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 10
状态转移方程:pa[i][j] = max (pa[i-1][j+1],max(pa[i][j+1],pa[i+1][j+1]))+pa[i][j];
源代码:
#include <bits/stdc++.h>
using namespace std;
int pa[14][100001];
int main()
{
int n,i,j,x,t,maxt;
while (scanf("%d",&n)!=EOF)
{
if (n == 0)
break;
memset(pa,0,sizeof(pa));
maxt = 0;
for (i = 1; i <= n; i++)//输入值,并给二维数组赋值。
{
scanf("%d %d",&x,&t);
pa[x+1][t]++;
if (t > maxt)//确定二维数组的边界,即最大的时间。
maxt = t;
}
for(j = maxt-1; j >= 0; j--)
for (i = 1; i <= 11; i++)
pa[i][j] = max (pa[i-1][j+1],max(pa[i][j+1],pa[i+1][j+1]))+pa[i][j];
printf("%d\n",pa[6][0]);
}
return 0;
}