HDU 1003最大子段和

来源:互联网 发布:中国保险保险网络大学 编辑:程序博客网 时间:2024/05/17 07:34

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1003

输入N,r然后输入n个数字,求这些数字中的最大子段和,并标明起点终点。

Input:

25 6 -1 5 4 -77 0 6 -1 1 -6 7 -5
 

Sample Output
Case 1:14 1 4Case 2:7 1 6
思路:简单的DP题。用dp[i]表示以数字i为终点的最大子段和。初始化肯定是它本身。若dp[i-1]>0,则dp[i]可以加上dp[i-1],

最后循环一遍找出max(dp[i]).打印起点和终点,终点就是i,往前找到起点。

#include<stdio.h>#include<string.h>int main(){    int T,N,i,j,max=0;    int a[100010],b[100010];    scanf("%d", &T);    for(int m=1;m<=T;m++)    {        scanf("%d", &N);        memset(a, 0, sizeof(a));        memset(b, 0, sizeof(b));        for (i = 1; i <= N; i++)        {            scanf("%d", &a[i]);        }        b[1] = a[1];        for(i=2;i<=N;i++)        {            if (b[i - 1] < 0)                b[i] = a[i];//为a[i]本身            else b[i] = b[i - 1] + a[i];        }        max = 1;        for (i = 1; i <= N; i++)        {            if (b[max] < b[i])                max = i;        }        int sum = 0,l;        for (j = max; j > 0; j--)        {            sum += a[j];            if (sum == b[max])                l = j;        }        printf("Case %d:\n", m);        printf("%d %d %d\n", b[max], l, max);        if (m < T)            printf("\n");    }    return 0;}


原创粉丝点击