Maximum Subsequence Sum【PAT 1007题】---简单的动态规划

来源:互联网 发布:linux系统克隆 编辑:程序博客网 时间:2024/06/13 21:52

最大连续子序列和,动态规划的简单题,其实这个题不用动态规划的方法去理解算法也很简单,用sum存储遍历途中遇到的当前最大和,用temp存储当前处理的子序列和,如果temp>=0,则访问a[i]时,temp += a[i],但若temp是小于0的,则加上a[i]以后定然小于a[i],所以直接把temp更新为a[i],访问一个新的子序列,如果temp大于sum,则更新sum,以上就是解题思路,由于题目中要求求出最大和的同时,记录下相应子序列的首尾元素值,若序列全是负数,则最大和定义为0,首尾定义为整个序列的首尾值,所以程序中需要增加一些变量以存储以上信息.

#include <stdio.h>#include <stdlib.h>int main(){    int k;    int *data;    int i;    int start, end, sum, temp, tempi, tempj;    while(scanf("%d", &k) != EOF)    {        data = (int *)malloc(k * sizeof(int));        for(i = 0; i < k; i ++)        {            scanf("%d", &data[i]);        }        sum = 0;        start = 0;        end = k - 1;        temp = 0;        tempi = 0;        tempj = 0;        for(i = 0; i < k; i ++)        {            if(temp >= 0)            {                temp += data[i];                tempj = i;            }            else            {                temp = data[i];                tempi = i;                tempj = i;            }            if(temp > sum || (temp == 0 && end == k - 1))//temp确实比sum大, 或者, sum依然是初始状态(end == k-1即表示)而且temp==0, 需要替换            {                sum = temp;                start = tempi;                end = tempj;            }        }        printf("%d %d %d\n", sum, data[start], data[end]);    }    return 0;}


原文链接:http://www.cnblogs.com/Rafy/archive/2012/03/17/2403091.html


0 0