最大上升子序列和(不一定连续)
思路:统计以s[i]结尾的上升子序列的和sum[i]
分为2类:是否比前面所有元素都小
- ①是 前面序列对其没有贡献:sum[i]=s[i]
- ②否 前面序列对其有贡献:sum[i]=max(sum[j]+s[i])(需遍历s[i]前面所有元素,保留最大值)
#include<iostream>
using namespace std;
const int maxn=1001;
int s[maxn];
int sum[maxn];//上升子序列的和
int longest(int n){
int ans=0;//最大上升子序列和
for(int i=0;i<n;i++){
sum[i]=s[i];
for(int j=0;j<i;j++){
if(s[i]>s[j])sum[i]=max(sum[i],sum[j]+s[i]);
}
ans=max(ans,sum[i]);
}
return ans;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&s[i]);
}
printf("%d\n",longest(n));
}
return 0;
}