给定一个长为n的序列,求其中的一个上升序列,使其和最大并求和。
要注意有负数的情况。很常规的dp
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int dp[10000],a[10000];
int main() {
// std::ios::sync_with_stdio(false);
int n;
while(cin>>n) {
if(n==0)
break;
int num=0;
memset(dp,0,sizeof(dp));
for(int i=0; i<n; i++)
cin>>a[i];
if(a[0]>0)
num=dp[0]=a[0];
for(int i=1; i<n; i++) {
for(int j=0; j<i; j++) {
if(a[i]>a[j])
dp[i]=max(dp[i],dp[j]+a[i]);
}
dp[i]=max(dp[i],a[i]);
num=max(dp[i],num);
}
cout<<num<<endl;
}
}