用二位数组dp[i][j]记录组数为i,前j个数字的最大子段和。

转移方程dp[i][j]=min(dp[i][j-1],dp[i-1][k])+arr[j],方程表示的是考虑到第j个数,可以把它直接加入到第i组,也可以作为第i组的开头,如果作为第i组的开头,就要考虑第i-1组该以哪个数结尾。直接枚举k,k从(i-1)到j-1。

优化:因为题目n值范围过大,显然二维数组不行。而d[i][x]只与d[i-1][x]有关,所以可以将其降低至一维。即dp[j]表示前j个数所分段后的和。因为dp[i-1][k]的取值需要一重循环,极有可能导致超时,所以使用数组max[],存储当前层的最大值,以供下一层求值使用。dp[j] = max(dp[j-1] + a[j], max[j-1] + a[j])

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+;
const int INF=1e9+;
int dp[N];
int arr[N];
int ma[N];
int main(){
int n,m;
while(cin>>m>>n){
memset(ma,,sizeof ma);
for(int i=;i<=n;i++)
scanf("%d",&arr[i]);
int tmp;
for(int i=;i<=m;i++){//第i组
tmp=-INF;
for(int j=i;j<=n;j++){//考虑第j个人
dp[j]=max(dp[j-],ma[j-])+arr[j];
ma[j-]=tmp;//此时tmp的值还没有更新,所以应该是当j=j-1时的最大值
tmp=max(tmp,dp[j]);
}
}
printf("%d\n",tmp);
}
return ;
}

最新文章

  1. Linux命令学习总结:hexdump
  2. 运行在linux上的mysql常用命令
  3. Sqlerver_各类函数
  4. uva 10047 The Monocycle(搜索)
  5. 理解Python的迭代器
  6. Introspector(内省)简单演示样例 与 简单应用
  7. 基于cygwin构建u-boot(五)结尾:shell 工具
  8. windows/Linux下安装maven
  9. 一个部署了tomcat服务的linux服务器,运行一段时间后出现内存和空间不足的问题
  10. python 信号处理
  11. js变量的一点认识
  12. Unity UGUI实现分段式血条
  13. Linux相关学习笔记-文件系统
  14. Python_001_开始学习的一些准备
  15. 爬虫——cookies池的搭建
  16. jquery 操作表单的问题
  17. 关于eclipse调试时程序控制台不能自动打开
  18. hibernate的findByExample 外键参数查询解决方案
  19. ubuntu安装sublime教程
  20. bzoj3393

热门文章

  1. java,jq,ajax写分页
  2. Ubuntu环境下部署Django+uwsgi+nginx总结
  3. HDU 3303 Harmony Forever 前缀和+树状数组||线段树
  4. 理解BERT:一个突破性NLP框架的综合指南
  5. 五大经典卷积神经网络介绍:LeNet / AlexNet / GoogLeNet / VGGNet/ ResNet
  6. [WPF]为什么使用SaveFileDialog创建文件需要删除权限?
  7. 解读windows认证
  8. 读者来信 | 如何判断HBase Major Compact是否执行完毕?(已解决)
  9. (七)Spring Cloud 配置中心config
  10. JS中this指向问题和改变this指向