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;
}
相关推荐
CHHH_HHH5 分钟前
【Linux系统篇】深入解析Linux文件系统:从磁盘寻址到软硬链接
linux·服务器·开发语言·后端·ubuntu
yngsqq13 分钟前
窗体快速取消
java·开发语言
XiaQ091941 分钟前
Linux 常用命令学习笔记(用户管理篇):用户、组与权限的钥匙
linux·开发语言·笔记·学习
不可求~1 小时前
C++ 报错交给 AI 之前,先准备好这 8 类信息
开发语言·c++·人工智能
名字还没想好☜1 小时前
用 Python struct 解析二进制协议:pack/unpack、字节序与对齐踩坑
开发语言·python·二进制·struct
一知半解仙1 小时前
当机器人学会泛化,而我在写Java:一名后端开发者的2026年8月21日观察手记
java·开发语言·机器人
青 春 记 忆2 小时前
LeetCode 155. 最小栈|Python 解法详解
开发语言·python·leetcode
剩下了什么10 小时前
float32 与 float64 精度陷阱:如何在 Go 中避免错误使用
开发语言·后端·golang
指尖时光.11 小时前
Three.js 超全入门综合案例
开发语言·javascript·ecmascript
暴力求解11 小时前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip