hdu 1087 Super Jumping! Jumping! Jumping!
/*
hdu 1087 Super Jumping! Jumping! Jumping!
这题的意思就是你跳了一个格子那么你走的下一个格子的权值必须大于前一个格子的权值。
要求最后的权值之和最大。
设a[i](0<=i<n)为其对应的格子的权值
那么动态规划的方程可以这么列设f(i)为走到第i个位子时的权值和的最大值。
f(i)=max{f(j)|0<=j<i and a[i]>a[j]}+a[i];
那么我们要记录的信息就是f(j)的表;
因为我们不知道他最后可能会走哪一个格子所以要最后f(i)表中记录的最大值就是我们要的答案。
*/
#include<stdio.h> #include<string.h> int a[1005]; //a存放权值 int b[1005]; //b存放最大权值之和,因为不用存放路径怎么走就不用了哈哈 int f(int i) { int j,max=0; for(j=0;j<i;j++) { if(b[j]>max&&a[j]<a[i]) { max=b[j]; } } b[i]=max+a[i]; } int main() { int n,i,max; while(scanf("%d",&n)!=EOF) { max=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); if(n==0) break; for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(i=0;i<n;i++) { f(i); if(b[i]>max) { max=b[i]; } } printf("%d\n",max); } return 0; }