zoukankan      html  css  js  c++  java
  • 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("
    ");
    	}
     } 
    

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

  • 相关阅读:
    jmeter之正则表达式
    python_appium搭建APP自动化测试环境
    网络编程
    四种单例模式
    Pycharm快捷键
    面向对象
    阶段性总结
    模块之numpy,pandas,matplotlib
    模块之json,pickle,os,sys,logging
    模块之Time,datatime,hashlib,hmac
  • 原文地址:https://www.cnblogs.com/greengenius/p/9206181.html
Copyright © 2011-2022 走看看