题目描述
给定长度为n的正整数序列a1,a2,…,an。
求一个递增的子序列,和最大。
思路:
动态规划
对于任意的 j < i => dp[i] = max(dp[i], dp[j] + a[i])
C++代码如下:
// 给定长度为n的正整数序列a1,a2,…,an。
// 求一个递增的子序列,和最大。
// 对于任意的 j < i => dp[i] = max(dp[i], dp[j] + a[i]);
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005;
int a[maxn];
long long dp[maxn];
int main()
{
int n;
while (scanf("%d", &n) != EOF && n){
memset(a, 0, sizeof(a)); memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; i++){
scanf("%d", &a[i]);
dp[i] = a[i];
}
for (int i = 0; i < n; i++){
for (int j = 0; j < i; j++){
if (a[i] > a[j]){
dp[i] = max(dp[i], dp[j] + a[i]);
}
}
}
long long ans = dp[0];
for (int i = 0; i < n; i++){
ans = max(ans, dp[i]);
}
printf("%lld\n", ans);
}
return 0;
}