zoukankan      html  css  js  c++  java
  • Max Sum

    题意为最长连续子序列和。

    对我来说是第一道dp题,也是一道模板题。

    需要输入子段的开始start和结束的位置end。

    定义序列为A:1----n;

    A[1]....A[i]的maxsum取决于A[1]....A[i-1]

    A[1...i]=max{maxA[1...i-1]+A[i],A[i]}

    即如果max A[1...i-1]<0,则起始位置start转化为i,不难理解,无论A[i]是正是负,它加上负的max都将减小自身。而这也是唯一可以修改start的地方

    请注意,这时转化的都是tempsum即是临时的。

    真正的maxsum只有在临时的tempsum大于maxsum时才会修改,并且修改end=i;

    即是说,即使因为maxA[1....i-1]是<0的,起始位置start因此修改,但是当依此运行下去,如果最终的tempsum无法大于maxsum还是不能修改掉maxsum的start和end的。

    #include <iostream>
    using namespace std;
    int a[100010];
    bool flag;
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	int c=1;
    	while(t--)
    	{
    		printf("Case %d:
    ",c++);
    		int n;
    		scanf("%d",&n);
    		for(int i =0;i<n;i++)
    		{
    			scanf("%d",&a[i]);
    		}
    		int maxsum=a[0],tempsum=a[0];
    		int start=0,end=0, itemp=0;
    		for(int i=1;i<n;i++)
    		{
    			if(tempsum<0)
    			{
    				tempsum=0;
    				itemp=i;
    			}
    			tempsum+=a[i];
    			if(tempsum>maxsum)
    			{
    				maxsum=tempsum;
    				start=itemp;
    				end=i;
    			}
    		}
    		printf("%d %d %d
    ",maxsum,start+1,end+1);
    		if(t!=0)
    			printf("
    ");
    	}
    	return 0;
    }


  • 相关阅读:
    oracle number数据类型
    codepage 和 charset
    嵌入式jetty的HTTP实现
    OpenCV For Java环境搭建与功能演示
    luogu P2783 有机化学之神偶尔会做作弊
    [国家集训队]稳定婚姻
    [SCOI2014]方伯伯运椰子
    [APIO2017]商旅
    luogu P1121 环状最大两段子段和
    [APIO/CTSC 2007]数据备份
  • 原文地址:https://www.cnblogs.com/unclejelly/p/4082141.html
Copyright © 2011-2022 走看看