其实就是一个类似于数塔的问题!
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6987 Accepted Submission(s): 2247
为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中期中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)
6 5 1 4 1 6 1 7 2 7 2 8 3 0
4
源代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_ARRAY_SIZE 100000 int data[MAX_ARRAY_SIZE][11];//存放最初的数据 int cost[MAX_ARRAY_SIZE][11];//存放各个子问题的最优解 int mark[MAX_ARRAY_SIZE][11];//存放输出最优解方案标志 int main(int argc,char *argv[]) { int n; while(scanf("%d",&n),n!=0){ memset(data,0,sizeof(data)); int i,x,T,max_T=0; //初始化data for(i=1;i<=n;i++){ scanf("%d%d",&x,&T); if(T>max_T) max_T=T; data[T][x]++; } //dp初始化 for(i=0;i<11;i++){ cost[max_T][i]=data[max_T][i]; } //dp过程 for(i=max_T-1;i>=0;i--){ int j; for(j=0;j<11;j++){ int lvalue,mvalue,rvalue,maxvalue; if(j==0){ lvalue=-1; }else{ lvalue=cost[i+1][j-1]; } mvalue=data[i+1][j]; if(j==10){ rvalue=-1; }else{ rvalue=cost[i+1][j+1]; } if(lvalue>mvalue){ maxvalue=lvalue; mark[i][j]=-1; }else{ if(mvalue>rvalue){ maxvalue=mvalue; mark[i][j]=0; }else{ maxvalue=rvalue; mark[i][j]=1; } } cost[i][j]=data[i][j]+maxvalue; } } printf("%d\n",cost[0][5]); } return 0; }