C - Max Sum Plus Plus HDU - 1024
2024-09-07 09:13:32
用二位数组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 ;
}
最新文章
- Linux命令学习总结:hexdump
- 运行在linux上的mysql常用命令
- Sqlerver_各类函数
- uva 10047 The Monocycle(搜索)
- 理解Python的迭代器
- Introspector(内省)简单演示样例 与 简单应用
- 基于cygwin构建u-boot(五)结尾:shell 工具
- windows/Linux下安装maven
- 一个部署了tomcat服务的linux服务器,运行一段时间后出现内存和空间不足的问题
- python 信号处理
- js变量的一点认识
- Unity UGUI实现分段式血条
- Linux相关学习笔记-文件系统
- Python_001_开始学习的一些准备
- 爬虫——cookies池的搭建
- jquery 操作表单的问题
- 关于eclipse调试时程序控制台不能自动打开
- hibernate的findByExample 外键参数查询解决方案
- ubuntu安装sublime教程
- bzoj3393
热门文章
- java,jq,ajax写分页
- Ubuntu环境下部署Django+uwsgi+nginx总结
- HDU 3303 Harmony Forever 前缀和+树状数组||线段树
- 理解BERT:一个突破性NLP框架的综合指南
- 五大经典卷积神经网络介绍:LeNet / AlexNet / GoogLeNet / VGGNet/ ResNet
- [WPF]为什么使用SaveFileDialog创建文件需要删除权限?
- 解读windows认证
- 读者来信 | 如何判断HBase Major Compact是否执行完毕?(已解决)
- (七)Spring Cloud 配置中心config
- JS中this指向问题和改变this指向