首页 > 其他 > 详细

题解——最大的和

时间:2020-08-19 00:36:23      阅读:58      评论:0      收藏:0      [点我收藏+]

技术分享图片

解法一:分治思想

技术分享图片

 

解法二:(暴力模拟)

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[200200];
int n;
int fun()//两次循环暴力计算
{
  int sum=0;
  int maxm=-213113;
  for(int j=1;j<=n;j++){ //(每一次就相当于从起点开始用了一次擂台法求“和”的最大值)
    for(int i=j;i<=n;i++){
      sum+=a[i];
      maxm=max(sum,maxm);//maxm在动态变化
    }  
    sum=0;
  }
  return maxm;
}
int main()
{
  cin>>n;
  for(int i=1;i<=n;i++)
    cin>>a[i];
  cout<<fun();
  return 0;
}

解法三:(贪心算法)

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[200200];
int n;
int fun() //贪心算法(时间复杂度最低)
{
/* 原理在于:
如果前缀和sum变成了负数,那么下一个数就不需要前面的数了(因为还不如只选它一个)
如果前缀和sum没有成符数,就说明前面所有的前缀元素和是有贡献的,不能抛弃他们*/
  int sum=0;
  int maxm=-213113;
  for(int j=1;j<=n;j++)

  {

    sum+=a[j];
    if(sum<0)
      sum=0;
    maxm=max(sum,maxm);
  }
  return maxm;
}
int main()
{
  cin>>n;
  for(int i=1;i<=n;i++)
    cin>>a[i];
  cout<<fun();
  return 0;
//此题如果出现测试集全为负数的情况就需要开特例处理了
}

 

题解——最大的和

原文:https://www.cnblogs.com/Hello-world-hello-lazy/p/13526911.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!