HDU 1003 最大子段和
Posted greengenius
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1003 最大子段和相关的知识,希望对你有一定的参考价值。
一看就知道是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: ",i); printf("%d %d %d ",ans1,ans2,ans3); if(i<t) printf(" "); } }
哦对了还要注意输出格式,最后一个样例不需要空两行
以上是关于HDU 1003 最大子段和的主要内容,如果未能解决你的问题,请参考以下文章