Super Jumping! Jumping! Jumping! hdu1087(最大遞增子段和)
阿新 • • 發佈:2018-12-10
求一個數列的最大遞增子序列和。
注意限制在32位整型範圍內,是可能有負數的。
前i個數字的最大遞增子序列和有兩種情況,加上第i個數字,不加上第i個數字。前者是把i串到之前的某個子段之後一位。
#include<bits/stdc++.h> using namespace std; const int Max=0x3f3f3f3f; int main() { int a[1010],n,sum[1010];//sum陣列儲存第i個數和前面串起來以後能夠達到的最大值 並不是答案 while(cin>>n&&n!=0) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); int res=a[1]; memset(sum,-0x3f,sizeof(sum)); sum[1]=a[1]; for(int i=2;i<=n;i++) { //列舉每個i sum[i]=a[i]; for(int j=1;j<i;j++) //列舉i之前的每一個數,找到比i小的數串聯起i之後的最大值 if(a[j]<a[i]) sum[i]=max(sum[i],sum[j]+a[i]); res=max(res,sum[i]);//sum[i]就是把i串進去,要麼就不串 } cout<<res<<endl; } return 0; }