Total Submission(s): 19250 Accepted Submission(s): 6443
为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在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
解题思路:本题为动态规划基础题,直接打表,最后输出时间为0时位置为5处数值即可。
任意时间i在任意地点j处可接到的馅饼的最大值为max(cake[i+1][j-1],cake[i+1][j],cake[i+1][j+1]),即下一秒可到达的所有位置可获得的馅饼的值的最大值。超过输入最大时间以外数据的数组的存储部分全部为0,不需要处理,为节约时间,直接从max-1(max为输入时间的最大值)开始处理即可,最后目的值在cake[0][5]所在存储空间,即最开始位于坐标为5处,经过所有馅饼落下后,可以得到的馅饼的最大值。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int cake[100004][11]; int main() { int n; int x,y; int i,j; int max1; while(scanf("%d",&n)&&n) { max1=0; memset(cake,0,sizeof(cake)); for(i=0;i<n;i++) scanf("%d%d",&y,&x),cake[x][y]++,max1=max(max1,x); for(i=max1-1;i>=0;i--) { cake[i][0]+=max(cake[i+1][0],cake[i+1][1]); //别忘了边缘数据 for(j=1;j<10;j++) { cake[i][j]+=max(max(cake[i+1][j-1],cake[i+1][j]),cake[i+1][j+1]); //公式迭代 // if(cake[i][j]!=0) //printf("cake[%d][%d]=%d\n",i,j,cake[i][j]); } cake[i][10]+=max(cake[i+1][9],cake[i+1][10]); //别忘了边缘数据 } printf("%d\n",cake[0][5]); } return 0; }