题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087
题意:求上升子序列和的最大值
思路:和LIS相似,但这个是和的最大值,那么只需要吧dp【i】初始化为本身再把+1的长度改为+a【i】就行了,只要理解了dp,活用就简单了。
代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int maxn = 1e3 + 5;
int n;
int a[maxn];
int dp[maxn];
int main() {
//freopen ("in.txt", "r", stdin);
while (~scanf ("%d",&n)&&n){
for (int i=1;i<=n;i++) {
scanf ("%d",&a[i]);
dp[i]=a[i];
}
int Max=-INF;
for (int i=1;i<=n;i++){
for (int j=1;j<=i;j++){
if (a[j]<a[i]&&dp[i]<dp[j]+a[i]){
dp[i]=dp[j]+a[i];
}
}
}
for (int i=1;i<=n;i++) {
Max=max(Max,dp[i]);
}
printf ("%d\n",Max);
}
return 0;
}