求一段上升子序列的最大值——Super Jumping! Jumping! Jumping!

题意见标题
首先我们来看这样一个例子一段数列
a 1   a 2   a 3   ⋅ ⋅ ⋅ a n a_1 \ a_2 \ a_3 \ ··· a_ n a1 a2 a3 an
现在求取一段上升子序列的最大值
现在我们令 d p [ i ] dp[i] dp[i]表示从数组开头到第i个数一段上升子序列的最大值
那么我们很快得到状态转移方程 d p [ i ] = m a x ( d p [ j ] ( j = 1... i − 1 ) ) + a [ i ]   ( a [ i ] > a [ j ] ) dp[i] = max(dp[j](j=1...i-1))+a[i] \ (a[i]>a[j]) dp[i]=max(dp[j](j=1...i1))+a[i] (a[i]>a[j])现在以下图做例
令设 i = 3;
那么考察3之前的一段上升子序列的最大值,如果有a[i]<a[3];那么意味着a[3]可以加入dp[i]其中,将其变成dp[3];

演示
code:

#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int a[1005];
int dp[1005];
signed main(){
	int t;
	while(1){
		cin>>t;
		if(t==0) break;
		for(int i=1;i<=t;i++)
		{
			cin>>a[i];
		}
		int ans = 0;
		for(int i=1;i<=t;i++)
		{
			int maxn = 0;
			for(int j=1;j<i;j++)
			{
				if(a[j]<a[i]){//状态转移方程
					maxn = max(maxn,dp[j]);
				}
			}
			dp[i] = maxn+a[i];		
		}
		for(int i=1;i<=t;i++)
			ans = max(ans,dp[i]);
		cout<<ans<<endl;
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值