码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1003 最大子段和

时间:2018-06-20 22:43:53      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:一个   pre   c++   表示   scan   标记   技术分享   TE   ase   

技术分享图片

一看就知道是dp了...

转移方程f[i]=max(f[i-1]+d[i],d[i])

主要是起始位置和结束位置的标记有点困难

这里用两个临时变量s,e表示当前组的起始位置和结束位置

可以这么想

一旦f[i-1]+d[i]<d[i],就说明可以新开一组,s=i,否则e++

只要当前最大和ans1<f[i],就可以更新起始位置ans2=s,结束位置ans3=e;

代码

#include<bits/stdc++.h>
using namespace std;
const int N=110000;
int d[N],dp[N];
int main()
{
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		int n,ans1,ans2,ans3,s,e;
		ans1=-1e9,ans2=ans3=s=1;
		e=0;
		scanf("%d",&n);
		for(int j=1;j<=n;j++)
			scanf("%d",&d[j]);
		for(int j=1;j<=n;j++)
		{
			if(dp[j-1]>=0)
				dp[j]=dp[j-1]+d[j],e++;
			else
				s=e=j,dp[j]=d[j];
			if(ans1<dp[j])
			{
				ans1=dp[j];
				ans2=s;
				ans3=e;
			}
		}
		printf("Case %d:\n",i);
		printf("%d %d %d\n",ans1,ans2,ans3);
		if(i<t) printf("\n");
	}
 } 

 哦对了还要注意输出格式,最后一个样例不需要空两行

HDU 1003 最大子段和

标签:一个   pre   c++   表示   scan   标记   技术分享   TE   ase   

原文地址:https://www.cnblogs.com/greengenius/p/9206181.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!