您的位置:首页 > 其它

poj2479_简单动态规划

2010-05-30 02:47 363 查看
题意:给定一个序列,在这个序列中任取不相交的两段,使得和最大,求最大和

解法:对于每个位置i,保留从开头到该位置能找到最大连续段的和,方法为从前往后扫,保留最大段tmp,和一个能加到位置i的最大数sum,如果sum+A[i]>tmp,则tmp=sum+A[i];如果sum<0则令sum=0,不作贡献;然后从后往前做一遍,做的过程中对于位置i,找出它前面能找到的最大段和它后面能找到的最大段的和最大,代码如下:

#include <iostream>
using namespace std;
int A[50005];
int matrix[50005];
int main()
{
int t,n,i;
int sum;
scanf("%d",&t);
while (t--)
{
int tmp=-100000;
sum=0;
scanf("%d",&n);
for (i=0;i<n;i++)
{
scanf("%d",&A[i]);
sum+=A[i];
if (sum>tmp)
{
tmp=sum;
}
if (sum<0)
{
sum=0;
}
matrix[i]=tmp;
}
int ans=-1000000;
sum=0;
tmp=-1000000;
for (i=n-1;i>=1;i--)
{
sum+=A[i];
if (sum>tmp)
{
tmp=sum;
}
if (sum<0)
{
sum=0;
}
if (matrix[i-1]+tmp>ans)
{
ans=matrix[i-1]+tmp;
}
}
printf("%d/n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: