题目链接: [Super Jumping! Jumping! Jumping!]
大致题意:
长度为n的序列,找到一条单调递增但不一定连续的序列,求其序列和
解题思路:
dp[i]表示的是前i个并且包含第i个的最大递增子序列和
若a[i]>a[j]并且满足dp[j] + a[i] > dp[i],dp[i]=dp[j]+a[i]
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll a[2000];
ll dp[2000];
int n;
ll LIS() {
memset(dp, 0, sizeof dp);
ll ans = 0;
for (int i = 1; i <= n; ++i) {
dp[i] = a[i];
for (int j = 1; j < i; ++j) {
if (dp[j] + a[i] > dp[i] && a[j] < a[i])dp[i] = dp[j] + a[i];
}
ans = max(ans, dp[i]);
}
return ans;
}
int main(void)
{
while (cin >> n,n) {
memset(dp, 0, sizeof dp);
for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
cout << LIS() << endl;
}
return 0;
}