动态规划——最大累加和

动态规划?
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

Hint
st <= st+5*x < n, x不一定从0开始也不一定到n-1结束

Author
zmx

#include <stdio.h>

#define MAX(a, b) (a>b)? a: b
long long a[100004];
long long max;

int main()
{
    int n, i;
    while(scanf("%d", &n) != EOF)
    {
        max = -100001;
        for(i = 0; i < n; i++)
        {
            scanf("%lld", &a[i]);
            if(i >= 5)
            {
                if(a[i] + a[i-5] > a[i])
                {
                    a[i] += a[i-5];
                }
            }
            max = MAX(max, a[i]);
        }
        printf("%lld\n", max);
    }
    return 0;
}


/*************************************************** User name: jk1606 Result: Accepted Take time: 180ms Take Memory: 892KB Submit time: 2017-01-14 16:39:35 ****************************************************/
    原文作者:动态规划
    原文地址: https://blog.csdn.net/BlessingXRY/article/details/54427581
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞