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;
}
相关推荐
王老师青少年编程1 小时前
2025年【江苏“信息与未来”编程思维】真题及题解(T2:坐标变换)
c++·题解·真题·坐标变换·编程思维·江苏·信息与未来
西门吹-禅3 小时前
java springboot N+1问题
java·开发语言·spring boot
skywalk81634 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
2023自学中4 小时前
C++ 内存追踪器
linux·c++
IT笔记5 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
2zcode5 小时前
免费开源项目文档:基于MATLAB卷积神经网络的口罩佩戴检测系统
开发语言·matlab·cnn
逝水无殇5 小时前
C# 运算符重载详解
开发语言·后端·c#
TPBoreas6 小时前
配置信息防泄露方案:.env 环境隔离详解(dotenv-java)
java·开发语言
敲代码的嘎仔6 小时前
实习日志day6--实习日志day6--title命名规范化&businessType纠正&补充缺失的@Log注解&报警与通信模块补充&产出阶段总结文档
java·开发语言·人工智能·git·python·实习·大二
江华森7 小时前
Python 实现高德地图找房(一):环境搭建与数据爬虫
开发语言·爬虫·python