hdu 1024(dp)
2024-08-25 00:22:39
题意:从n个数中选出m段不相交的连续子段,求这个和最大。
分析:经典dp,dp[i][j][0]表示不取第i个数且前i个数分成j段达到的最优值,dp[i][j][1]表示取了第i个数且前i个数分成j段达到的最优值。
那么有:
dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]).
dp[i][j][1]=max(dp[i-1][j-1][0]+a[i],max(dp[i-1][j-1][1],dp[i][j][1])+a[i])).
红色部分略坑,仔细体会一下,因为连续的一段可能拆成多一段刚好符合m段到达最好,不一定得选一段连续的子系列只当成一段最好,可能分成多段更优。
由于n过大,使用滚动数组优化空间。
#include <algorithm>
#include <cstdio>
#include <cstring>
#define N 1000010
#define inf 0x3f3f3f3f
using namespace std;
int dp[][N][],a[N];
int n,m;
int main()
{
while(scanf("%d%d",&m,&n)>)
{
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for (int i = ; i <= m; i++) {
dp[][i][] = dp[][i][] = dp[][i][] = dp[][i][] = -inf;
}
dp[][][]=dp[][][]=;
for(int i=,t=;i<=n;i++,t=!t)
{
for(int j=;j<=i&&j<=m;j++)
{
dp[t][j][]=max(dp[!t][j][],dp[!t][j][]);
if(j)dp[t][j][]=max(dp[!t][j-][]+a[i],max(dp[!t][j][],dp[!t][j-][])+a[i]);
}
}
printf("%d\n",max(dp[n&][m][],dp[n&][m][]));
}
}
最新文章
- java 学习写架构必会几大技术点
- android中布局文件中 layout_weight 的属性详解
- Velocity笔记
- BZOJ4449 : [Neerc2015]Distance on Triangulation
- JavaScript简洁继承机制实现(不使用prototype和new)
- 关于SparkMLlib的基础数据结构 Spark-MLlib-Basics
- oracle的nvl和sql server的isnull
- node.js操作mongoDB数据库
- Python全栈-magedu-2018-笔记8
- leetcode每日刷题计划-简单篇day4
- ajax 跳转页面时添加header
- config parser 模块
- class-dump 使用
- Evolution(矩阵快速幂)zoj2853
- hibernate--一级和二级缓存(使用Ehcache)以及查询缓存
- Java中线程同步的方法
- 在服务器端判断request来自Ajax请求(异步)还是传统请求(同步)
- Http请求中Content-Type
- hadoop 集群配置--增加减少新的机器不重启
- Error : getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443
热门文章
- 【linux驱动笔记】字符设备驱动相关数据结构与算法
- javascript笔记整理(数据类型强制/隐式转换 )
- C++内存管理(超长)
- Delphi XE7下如何创建一个Android模拟器调试
- 基于visual Studio2013解决C语言竞赛题之1015日期计算
- Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity
- CentOS下利用sshpass不用手动输入密码远程执行命令
- Tomcat设置成NIO时,使用的线程池
- sqlserver 存储过程实例
- C# / MSSQL / WinForm / ASP.NET - SQLHelper中返回SqlDataReader数据