【最大子段和】SDUT 3100 动态规划?

来源:互联网 发布:购物软件哪个好 编辑:程序博客网 时间:2024/06/05 04:10

动态规划?
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description

动态规划作为《运筹学》的一个分支,被广泛的用于解决较为复杂的经济管理问题,以达到的最优抉择,获得最大经济收益为目的。也因其多变性,非常的频繁的出现在信息学竞赛的赛场上。

动态规划的核心思想为不断将问题分解为子问题,一直到可以较容易的得到最优答案,再去决定其父问题的决策,因为很大程度的避免了重复子问题的抉择,故可以节约大量时间。

现在问题来了,有一个一维数组,存储了n个正整数,下标依次为0,1,2,….,n-1。

现在要从中选取一部分数,你要给出一个选择方案使得你的方案满足下列要求:

这部分元素的下标应满足st,st+5, st+5*2 , st+5*3, … , st+5*x (0 <= st < n ,st <= st+5*x < n)。在满足第一条要求的方案中,应选取其累加和最大的一种的方案。

Input

多组输入。

对于每组输入:

第一行输入一个n(1 <= n <= 100000)。

接下来的一行有n个整数y(-100000 <= y <= 100000)。

Output

对于每组数据,输出一个整数代表你的方案的累加和。

Example Input

10
1 2 3 4 5 6 7 8 9 10
3
1 -10 2
3
-1 -2 -3

Example Output

15
2
-1

代码:

#include<stdio.h>#include<string.h>#include<stdlib.h>int a[100055];int main(){    int n;    int i, sum[5], max[5], maxx;    while(~scanf("%d", &n))    {        memset(sum, 0, sizeof(sum));//初始化sum数组        max[0] = max[1] = max[2] = max[3] = max[4] = -100055;//赋初值,使其足够小        for(i = 0; i < n; i++)//五种情况        {            scanf("%d", &a[i]);            if(i % 5 == 0)//第一种            {                sum[0] += a[i];//求和,如果小于0,下一次再加,反而没有下一次的值大,所以小于0的时候使其等于0                if(max[0] < sum[0])//不断更新,最大字段和的值                {                    max[0] = sum[0];                }                if(sum[0] < 0) sum[0] = 0;//使其等于0            }            else if(i % 5 == 1)//第二种            {                sum[1] += a[i];                if(max[1] < sum[1])                {                    max[1] = sum[1];                }                if(sum[1] < 0) sum[1] = 0;            }            else if(i % 5 == 2)//第三种            {                sum[2] += a[i];                if(max[2] < sum[2])                {                    max[2] = sum[2];                }                if(sum[2] < 0) sum[2] = 0;            }            else if(i % 5 == 3)//第四种            {                sum[3] += a[i];                if(max[3] < sum[3])                {                    max[3] = sum[3];                }                if(sum[3] < 0) sum[3] = 0;            }            else if(i % 5 == 4)//第五种            {                sum[4] += a[i];                if(max[4] < sum[4])                {                    max[4] = sum[4];                }                if(sum[4] < 0) sum[4] = 0;            }        }        maxx = max[0];        for(i = 1; i < 5; i++)//找最大的字段和            if(maxx < max[i]) maxx = max[i];        printf("%d\n", maxx);    }    return 0;}
0 0
原创粉丝点击