这题也是DP,实质就是求最大递增子序列的和。用dp[i]表示从第1个元素到第i个元素的最大递增子序列的和,仔细分析可得出状态转移方程:dp[i]=max{ dp[j]+a[i] }, if(a[i] > a[j] ),其中 j < i。 从左开始遍历每个元素,求得dp[i],dp[i]中最大值即所求。
AC代码:
#include<stdio.h>
int main()
{
int n,i,j,max_num;
int a[1005],dp[1005];
while(scanf("%d",&n)!=EOF&&n!=0){
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
dp[0]=a[0];
for(i=1;i<n;i++){
dp[i]=a[i];
for(j=0;j<i;j++){
if(a[i] > a[j]&& dp[j]+a[i]>dp[i]){
dp[i]=dp[j]+a[i];
}
}
}
max_num=-9999999;
for(i=0;i<n;i++){
if(dp[i] > max_num)
max_num=dp[i];
}
printf("%d\n",max_num);
}
return 0;
}