您的位置:首页 > 其它

hdu1087 dp(最大上升子序列和)

2015-02-13 15:43 295 查看
题意,给出一列数,要求所有上升子序列中序列和最大的。

这回不是求长度了,但是还是相当基础的 dp 水题,只要用 dp [ q ] 记录以 第 q 个数 a [ q ] 为结尾的上升子序列的最大的和就可以了

对于 q ,初始化 dp [ q ] = a [ q ] ,从最前面到 q 遍历,若有第 i 个数 a [ i ] < a [ q ] ,则 dp [ q ] = max ( dp [ q ] , dp [ i ] + a [ q ] );

这样 dp 一遍并同时记录下最大值,就可以直接输出结果了

#include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b

int a[1002];
long long dp[1002];

int main(){
int n;
while(scanf("%d",&n)!=EOF&&n!=0){
int q,i,j;
long long m=0;
for(q=1;q<=n;q++){
scanf("%d",&a[q]);
dp[q]=a[q];
for(i=1;i<q;i++){
if(a[i]<a[q]){
dp[q]=max(dp[q],dp[i]+a[q]);
}
}
m=max(m,dp[q]);
}
printf("%I64d\n",m);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: