C++ 最大子段和(动态规划)

最大子段和 对应洛谷P1115 代码见下

cpp 复制代码
#include<iostream>
using namespace std;

#define maxn 200010
#define type int
#define inf -1000000000

type getMSS(int n, type a[], type dp[]){
    //dp[i]代表以第i个数结尾的最大子段和
    type ans = inf;
    dp[0] = 0;
    for(int i=1; i<=n; ++i){
        dp[i] = a[i] + max(dp[i-1], 0);
        ans = max(dp[i], ans);
    }
    return ans;
}

type dp[maxn];
type a[maxn];

int main(){
    int n;
    cin >> n;
    for(int i=1; i<=n; ++i){
        cin >> a[i];
    }
    cout << getMSS(n, a, dp) << endl;
    return 0;
}

代码练习1 对应蓝桥云课 区间最大子序列和 代码见下

cpp 复制代码
#include<iostream>
using namespace std;

#define maxn 2010
#define type int
#define inf -1000000000

type getMSS(int n, type a[], type dp[]){
    //dp[i]代表以第i个数结尾的最大子段和
    type ans = inf;
    dp[0] = 0;
    for(int i=1; i<=n; ++i){
        dp[i] = a[i] + max(dp[i-1], 0);
        ans = max(dp[i], ans);
    }
    // 转换成前i个元素的最大子段和
    dp[0] = inf;
    for(int i=1; i<=n; ++i){
      dp[i] = max(dp[i], dp[i-1]);
    }
    return ans;
}

type dp[maxn][maxn];
type a[maxn];

int main(){
  int n;
  cin >> n;
  for(int i=1; i<=n; ++i){
    cin >> a[i];
  }
  for(int i=1; i<=n; ++i){
    getMSS(n-i+1, &a[i-1], dp[i]);
  }
  int t;
  cin >> t;
  while(t--){
    int l, r;
    cin >> l >> r;
    cout << dp[l][r-l+1] << endl;

  }

}

代码练习 3 基德的冒险之旅 蓝桥云课 代码见下

cpp 复制代码
#include<iostream>
using namespace std;

#define maxn 100010
#define type long long
#define inf -10000000000011

type getMSS(int n, type a[], type dp[]){
    //dp[i]代表以第i个数结尾的最大子段和
    type ans = inf;
    dp[0] = 0;
    for(int i=1; i<=n; ++i){
        dp[i] = a[i] + max(dp[i-1], (type)0);
        ans = max(dp[i], ans);
    }
    // 转换成前i个元素的最大子段和
    dp[0] = inf;
    for(int i=1; i<=n; ++i){
      dp[i] = max(dp[i], dp[i-1]);
    }
    return ans;
}

void swap(int n, type a[]){
  for(int i=1; i<=n/2; ++i){
    swap(a[i], a[n+1-i]);
  }
}

type dppre[maxn], dppost[maxn];
type a[maxn];

int main(){
  int n, k;
  cin >> n >> k;
  for(int i=1; i<=n; ++i){
    cin >> a[i];
  }
  getMSS(n, a, dppre);
  swap(n, a);
  getMSS(n, a, dppost);
  swap(n, dppost);
  type ans = inf;
  for(int i=1; i+k+1 <=n; ++i){
    ans = max(ans, dppre[i]+dppost[i+k+1]);
  }
  cout << ans << endl;
  return 0;
}

代码练习 4 对应蓝桥云课 可删除数组的最大子数组和 代码见下

cpp 复制代码
#include <iostream>
using namespace std;

#define maxn 100010
#define maxk 101
#define inf -1000000000
int a[maxn];
int dp[maxn][maxk];


int main()
{
  int n, k;
  cin >> n >> k;
  for(int i=1; i<=n; ++i){
    cin >> a[i];
  }
  dp[0][0] = 0;
  for(int j=1; j<=k; ++j){
    dp[0][j] = inf;
  }
  for(int i=1; i<=n; ++i){
    dp[i][0] = a[i] + max(dp[i-1][0], 0);
    for(int j=1; j<=k; ++j){
      dp[i][j] = max(dp[i-1][j] + a[i], dp[i-1][j-1]); 
    }
  }
  int ans = inf;
  for(int i=1; i<=n; ++i){
    for(int j=0; j<=k; ++j){
      ans = max(ans, dp[i][j]);
    }
  }
  cout << ans << endl;
  // 请在此输入您的代码
  return 0;
}
相关推荐
码农小河662 小时前
基于PHP的电商后台蜜罐系统
开发语言·php
starzy19902 小时前
深入理解Scala柯里化函数:函数链式变换
开发语言·scala
ShineWinsu3 小时前
对于Qt:QTreeWidget常见属性以及QTreeWidgetItem类的解析
开发语言·c++·qt·gui·客户端·多叉树·qtreewidget
落羽的落羽3 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
总要学点什么4 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
Pniubi5 小时前
动态规划入门 ( - 力扣509斐波那契数)
算法·动态规划
starzy19908 小时前
深入理解Scala隐式值:编译期自动装配
开发语言·后端·scala
布莱克6058 小时前
Swift 条件语句详解:从 if 到 switch 的完整指南
开发语言·ssh·swift·switch·条件语句·guard·if
汉克老师8 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
吴可可1239 小时前
ActiveX调用WScript.Shell原理揭秘
开发语言