hdu 1087 Super Jumping! Jumping! Jumping! (dp最大递增字段和)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1087 Super Jumping! Jumping! Jumping! (dp最大递增字段和)相关的知识,希望对你有一定的参考价值。
取最大最小值时的初始化出问题了 !!!
WA了好多次 还一直以为是对的 甚至开始怀疑到 是不是因为 大量数据 所以得用scanf了。
结果证明特么确实 那个max不能初始化成-1,而是0。
龙叔给 的一组测试数据 10 8 7 2 3 4 5 你跑跑 是不是13
是的啊 恭喜你啊 错了 是14。
就是说 如果 那个i和j的 循环里 你的 a[i]<a[j]恒成立的话 你的dp[i]的值就会变成a[i]-1了而不是 期望中的a[i]。
网上的代码是怎么解决这个问题的呢 它是用了a[0]=0来做的。当然他前面就是用1到n的方式储存而不是0到n-1的方式。
附两段代码 就是输入的时候 1到n还是0到n-1的区别 自己感觉哪个舒服吧
#include <iostream> using namespace std; int n; int a[1005]; int dp[1005]; int main() { while(cin>>n) { if(n==0) break; for(int i=0;i<n;i++) { cin>>a[i]; dp[i]=0; } dp[0]=a[0]; for(int i=1;i<n;i++) { int max=0; for(int j=0;j<i;j++) { if(a[i]>a[j]&&dp[j]>max) max=dp[j]; } dp[i]=max+a[i]; } int max=0; for(int i=0;i<n;i++) { if(dp[i]>max) max=dp[i]; } cout<<max<<endl; } return 0; }
#include <iostream> #include <cstdio> using namespace std; int n; int a[1005]; int dp[1005]; int main() { while(~scanf("%d",&n),n) { for(int i=1;i<=n;i++) { scanf("%d",&a[i]); dp[i]=0; } dp[1]=a[1]; for(int i=2;i<=n;i++) { int max=0; for(int j=1;j<i;j++) { if(a[i]>a[j]&&dp[j]>max) max=dp[j]; } dp[i]=max+a[i]; } int max=0; for(int i=1;i<=n;i++) { if(dp[i]>max) max=dp[i]; } cout<<max<<endl; } return 0; }
以上是关于hdu 1087 Super Jumping! Jumping! Jumping! (dp最大递增字段和)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1087 Super Jumping! Jumping! Jumping! (DP+LIS)
HDu1087 Super Jumping! Jumping! Jumping!
HDU-1087.Super Jumping! Jumping! Jumping!
Super Jumping! Jumping! Jumping! HDU 1087