动态规划?

Think:
遍历时 累加为负数的时候就归零, 因为为负数时肯定不可能是最大值;
然后题目的周期 是 5 所以 进行 i + 5运算。 每次遍历结束后进行比较,最后输出MAX最大值。

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<bits/stdc++.h>

using namespace std;

int add(int m, int k, int a[]);

int main()
 {
   int T;
   int i;
   int a[100050];
   while(cin >> T)
   {
      memset(a, 0, sizeof(a));
      for (i = 0;i <= T - 1;i ++)
         {
           cin >> a[i];
         }
      long long int sum = add(0, T , a);
      for (i = 0;i <= 5 - 1;i ++)
         {
            long long int sum1  = add(i, T, a);
            if (sum1 > sum)
               sum = sum1;
         }
        cout << sum << endl;
   }
 return 0;
 }

 int add(int m, int k, int a[])
  {
    int i;
    long long int sum = 0;
    long long int temp = -10000000;
    for (i = m;i <= k - 1;i = i + 5)
       {
         sum = sum + a[i];
         if (temp < sum)
             temp = sum;
        if (sum < 0)
           sum = 0;

       }

  return temp;
  }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值