hdu-acm steps Max sum

/*求最大字段和,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;
}

时间: 2024-12-25 22:45:15

hdu-acm steps Max sum的相关文章

HDU acm 1003 Max Sum || 动态规划求最大子序列和详解

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 164592    Accepted Submission(s): 38540 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max su

杭电 HDU ACM 1003 Max Sum

 Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 164592    Accepted Submission(s): 38540 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the ma

HDU ACM 1024 Max Sum Plus Plus -&gt;最大连续子序列和的增强版

#include<iostream> #include<limits.h> using namespace std; #define N 1000005 int a[N],dp[N],maxpre[N]; int max(int a,int b) { return a>b?a:b; } int main() { int i,j,n,m,tmp; while(scanf("%d%d",&m,&n)==2) { for(i=1;i<=n;

HDU ACM 1003 Max Sum

注意只有一个负数时,负数也算最大值. #include<iostream> using namespace std; int main() { int a[100001]; int T,T2=0,n,i; int sum,maxsum,start,maxstart,maxend; cin>>T; while(T--) { cin>>n; for(i=0;i<n;i++) cin>>a[i]; maxstart=maxend=sum=0; maxsum=

HDU 1003:Max Sum(DP)

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 142742    Accepted Submission(s): 33225 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max s

杭电(hdu)ACM 1003 Max Sum

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 178139    Accepted Submission(s): 41558 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max s

HDU 1024:Max Sum Plus Plus(DP)

http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24675    Accepted Submission(s): 8478 Problem Description Now I think you have g

【HDU】1003 Max Sum [动态规划]

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1003 动态规划:f[i]表示以 i 结尾的最大的连续和.则转移方程为  f[1]=a[1]; if(f[i-1]+a[i]>=a[i]){ f[i]=f[i-1]+a[i]; } else {   f[i]=a[i]; } 再顺带更新一下起始终止位置就可以了. #include<cstdio> #include<iostream> #include<algorithm>

HDU 1024 DP Max Sum Plus Plus

题意:本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题. kuangbin专题. dp[i][j]=Max(dp[i][j-1]+a[j] , max( dp[i-1][k] ) + a[j] ) 0<k<j 注意可以换成一维数组.第一维i没有影响,我们要求dp[m][n],所以i维可以省去,每次保留前j-1个数之中最大的部分. 1 #include<iostream> 2 #include<string> 3 #include<algorith