您的位置:首页 > 其它

又谈最大连续子序列 hoj-1003

2013-07-11 15:59 190 查看
上面谈到用DP做最大连续子序列,后来又看到另一种方法:

网上说是一个专家提出,确实挺简单的,具体证明就不给出了,大家有兴趣的可以网上找找。

如果实在不理解就先敲几遍记住吧。。。。。

题意:也是给出一列数,求其中最大的连续序列和,和首尾排位数;

输入:第一行是测试例子数,然后跟N行例子。输出:两行,第一行是Case %d: 第二行依次是 最大和,首尾排位数,末尾排位数。

例子:

2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5

Case 1:
14 1 4

Case 2:
7 1 6

现给出AC代码:

#include<stdio.h>
int main()
{
int T,t,n,time,sum,maxs,i,a;
int st,ed;
scanf("%d",&t);
T=t;
while(t--)
{
time=1;sum=0;maxs=-1001;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a);
sum+=a;
if(sum>maxs)
{
maxs=sum;
st=time;
ed=i;
}
if(sum<0)
{
sum=0;
time=i+1;
}
}
printf("Case %d:\n%d %d %d\n",T-t,maxs,st,ed);
if(t)printf("\n");
}
return 0;
}


用DP过的代码:

#include<stdio.h>
int main()
{
int a[100010],sum[100010],maxn;
int N,n,m,i,st,ed;
scanf("%d",&n);
N=n;
while(n--)
{
scanf("%d",&m);
for(i=1;i<=m;i++)
scanf("%d",&a[i]);
sum[0]=0;
for(i=1;i<=m;i++)
{
if(sum[i-1]>=0)
sum[i]=sum[i-1]+a[i];//状态转移方程;
else
sum[i]=a[i];
}
maxn=-1001;
for(i=1;i<=m;i++)
if(sum[i]>maxn)
maxn=sum[i],ed=i;

st=ed;
for(i=ed-1;i>=1;i--)
if(sum[i]>=0)
st=i;
else break;
printf("Case %d:\n%d %d %d\n",N-n,maxn,st,ed);
if(n)printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: