博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu-acm steps Max sum
阅读量:6856 次
发布时间:2019-06-26

本文共 868 字,大约阅读时间需要 2 分钟。

/*求最大字段和,d[i]表示已 i 结尾(字段和中包含 i )在 a[1..i] 上的最大和,d[i]=(d[i-1]+a[i]>a[i])?d[i-1]+a[i]:a[i];max = {d[i],1<=i<=n} ;至于起点和终点,要各定义一个变量去跟踪,尤其是起点*/

#include"iostream"

#include"stdio.h"
#include"algorithm"
#include"string.h"
#include"ctype.h"
#include"cmath"
#define mx 100005
#define inf -32766
using namespace std;
int dp[mx];
int a[mx];
int n;
int main()
{
int t,i;
cin>>t;
int count1=0;
while(t--)
{
count1++;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
int cur=0,sx=0,ey=0,mxsub=dp[0]=a[0];
for(i=1;i<n;i++)
{
if(dp[i-1]+a[i]>=a[i])//因为题目要求的是若有多个解,取第一个,故这里要加上等号
{
dp[i]=dp[i-1]+a[i];
}
else
{
dp[i]=a[i];
cur=i;//记录起点的变化,当最大子序列的和改变时,起点有可能随着改变
}
if(dp[i]>mxsub)
{
mxsub=dp[i];
ey=i;
sx=cur;
}
}
cout<<"Case "<<count1<<":"<<endl;
cout<<mxsub<<' '<<sx+1<<' '<<ey+1<<endl;
if(t) cout<<endl;//题中用的是between,所以最后一个输出后面没有空行
}
return 0;
}

转载于:https://www.cnblogs.com/acm-jing/p/4246334.html

你可能感兴趣的文章
[转] C# 获取程序运行目录
查看>>
【OpenCV学习】极坐标变换
查看>>
在IIS 7.0中架设网站,并用VS2005来调试Web项目
查看>>
白话学习MVC(七)Action的执行一
查看>>
javaweb学习总结(四)——Http协议
查看>>
GridView实战二:使用ObjectDataSource数据源控件
查看>>
C# 视频监控系列(3):客户端——连接服务器并预览
查看>>
为什么Java byte 类型的取值范围是-128~127
查看>>
ElasticSearch怎样加入,检索数据
查看>>
redis事务
查看>>
深入分析 Javascript 单线程
查看>>
93.3. jinfo - Configuration Info
查看>>
解读基础设施即代码
查看>>
不容错过的2017数据科学15大热门GitHub项目
查看>>
2.4. 编译用于Tomcat的 War
查看>>
IPA提交APPStore问题记录(二)iOS10
查看>>
工信部意外披露国内5G预定频段:3300MHz起
查看>>
Gmail宕机 备份问题成云计算新题
查看>>
NetBeans主题配色方案加设置
查看>>
移动医疗怎么才能跟护士愉快地玩耍?
查看>>