POJ2479 第一次的DP....

开始研究DP了,这也是研究DP后第一道自己A出来的题目,心情是兴奋+激动+感动啊~~

 

刚看到题目的时候就联想到了最大连续子序列,只不过这题是由两个子序列构成,一样也是求两个最大连续子序列,思考了一会....不能像别的资料上说直接就想出状态方程...我可是想了好一会的...

 

思路就是把利用两个数组分别存前N个的最大连续子序列maxnum1[]和后N个的最大连续子序列maxnum2[],把第一个数组的前N个最大和加上第二个数组的后N个最大和就是一个新的数组按时ans[],而在这个新的数组里面找出最大值就是题目要求的两个序列的最大和了。好吧我承认我的ans[]白用了,直接可以找出最大值不用用ans[]保存。

以下是代码:

#include<stdio.h>
int main()
{
	int T,n,i,num[60000],maxnum1[60000],maxnum2[60000],dp[60000],max,dp2[60000],ans[60000];
	scanf("%d",&T);
	while(T--)
	{
		max=-100000;
		scanf("%d",&n);
		for(i=0;i<n;i++)
		scanf("%d",&num[i]);
		dp[0]=num[0];
		dp2[n-1]=num[n-1];
		maxnum2[n-1]=num[n-1];
		maxnum1[0]=num[0];
		for(i=1;i<n;i++)
		{
			if(dp[i-1]>0)
			dp[i]=dp[i-1]+num[i];
			else
			dp[i]=num[i];
			if(dp2[n-i]>0)
			dp2[n-i-1]=dp2[n-i]+num[n-i-1];
			else
			dp2[n-i-1]=num[n-i-1];
			if(dp[i]>maxnum1[i-1])
			maxnum1[i]=dp[i];
			else
			maxnum1[i]=maxnum1[i-1];
			if(dp2[n-i-1]>maxnum2[n-i])
			maxnum2[n-i-1]=dp2[n-i-1];
			else
			maxnum2[n-i-1]=maxnum2[n-i];
		}
		for(i=0;i<n-1;i++)
		{
			ans[i]=maxnum1[i]+maxnum2[i+1];
			if(ans[i]>max)
			max=ans[i];
		}
		printf("%d\n",max);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值