注解
1、本题是动态规划(dynamic programming)经典题,最大上升子序列。
2、用到的主要思想:max[i]表示从0到i的最大部分和。把每个位置依次与其之前的元素比较,如果之前的元素(如a[j])比当前元素a[i]小,就表示当前元素可以添加进来,则tmpMax=max[j]+a[i]。把当前元素之前的元素都遍历一遍之后,就找到了当前元素的最大值,也就是所有tmpMax中的最大值。再对所有max[i]遍历一遍,就找到了全局最大值。
代码
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int N;
scanf("%d", &N);
while(N){
int a[N];
int max[N];
memset(a, 0, sizeof(a));
memset(max, 0, sizeof(max));
for(int i=0; i<N; i++){
cin>>a[i];
max[i] = a[i];
}
int ans = a[0];
for(int i=1; i<N; i++){
for(int j=0; j<i; j++){
if(a[j]<a[i]){
int tmp = max[j] + a[i];
if(tmp>max[i]){
max[i] = tmp;
if(max[i]>ans){
ans = max[i];
}
}
}
}
}
printf("%d\n", ans);
scanf("%d", &N);
}
return 0;
}