位置子段最大子段和 hdu 1003 max sum ACM的开始

每日一贴,今天的内容关键字为位置子段

    这个标题的印象是较比刻深的,我的第一个动态规划标题,也是ACM的开始。最大字段和是较比经典的动归问题。求一个列序的最大子段和的关键点就在于断判一个元素的归属问题,dp[i]表现含包第i个元素的最大子段和的结果,对于元素a[i],如果dp[i-1]>0那么加上dp[i-1]是有利益的,反之dp[i-1]就是赘累。这个标题有一个很好地问法,就是问你这个子段的肇端位置和束结位置。很简单,录记一下束结位置,然后根据你的动归转移方程和自己的思惟就可以失掉这个列序的肇端位置和束结位置。面下看代码。

    每日一道理
信念是巍巍大厦的栋梁,没有它,就只是一堆散乱的砖瓦;信念是滔滔大江的河床,没有它,就只有一片泛滥的波浪;信念是熊熊烈火的引星,没有它,就只有一把冰冷的柴把;信念是远洋巨轮的主机,没有它,就只剩下瘫痪的巨架。
#include<iostream>
using namespace std;
int a[100001],b[100001];
int main()
{
    int T,i,k,max,n,j,e;
    cin>>T;
    for(i=1;i<=T;i++)
    {
        cin>>a[0];
        for(k=1;k<=a[0];k++)
            cin>>a[k];
        max=a[1];
        b[1]=a[1];
        j=1;
        for(n=2;n<=a[0];n++)
        {
            if(b[n-1]<0)
                b[n]=a[n];
            else b[n]=b[n-1]+a[n];
            if(b[n]>max)
            {
                max=b[n];
                j=n;
            }
        }
        if(max<0)
            cout<<"Case "<<i<<":"<<endl<<max<<" "<<j<<" "<<j<<endl;
        else {
            for(e=j-1;e>0;e--)
                if(b[e]<0)
                    break;
            cout<<"Case "<<i<<":"<<endl<<max<<" "<<e+1<<" "<<j<<endl;
        }
        if(i<T) 
            cout<<endl;
    }
    return 0;
}

    
 

文章结束给大家分享下程序员的一些笑话语录: 问答
Q:你是怎么区分一个内向的程序员和一个外向的程序员的? A:外向的程序员会看着你的鞋和你说话时。
Q:为什么程序员不能区分万圣节和圣诞节? A:这是因为 Oct 31 == Dec 25!(八进制的 31==十进制的 25)

posted @ 2013-05-04 20:21  坚固66  阅读(157)  评论(0编辑  收藏  举报