首页 > 学院 > 开发设计 > 正文

HDU-1087 Super Jumping! Jumping! Jumping!(上升子序列最大和)

2019-11-08 18:24:27
字体:
来源:转载
供稿:网友

和求最长上升子序列的元素个数有点相似,状态转移方程为dp[i]=max(dp[j]+a[i],dp[i])其中a[j]<a[i], 注意要把所有元素都小于0的情况单独拿出来讨论

#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int p=-0x3f3f3f3f;int main(){	int n;	long long a[1000+1];	long long dp[1000+1];	int flag;	while(cin>>n&&n!=0){		flag=0;		memset(dp,p,sizeof(dp));		dp[0]=0;		for(int i=1;i<=n;i++){			cin>>a[i];			if(a[i]>=0) flag=1;		}		for(int i=1;i<=n;i++){			for(int j=0;j<i;j++){				if(a[j]<a[i]) dp[i]=max(dp[j]+a[i],dp[i]);//因为j从0开始递增且dp[0]=0,就使得dp[i]刚开始就等于a[i]			}		}		if(!flag){			sort(a,a+n+1);			cout<<a[n-1]<<endl;			continue;		}		sort(dp,dp+n+1);		cout<<dp[n]<<endl;	}	return 0;} 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表