传送门:Max Sum Plus Plus

题意:从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][]));
}
}

最新文章

  1. java 学习写架构必会几大技术点
  2. android中布局文件中 layout_weight 的属性详解
  3. Velocity笔记
  4. BZOJ4449 : [Neerc2015]Distance on Triangulation
  5. JavaScript简洁继承机制实现(不使用prototype和new)
  6. 关于SparkMLlib的基础数据结构 Spark-MLlib-Basics
  7. oracle的nvl和sql server的isnull
  8. node.js操作mongoDB数据库
  9. Python全栈-magedu-2018-笔记8
  10. leetcode每日刷题计划-简单篇day4
  11. ajax 跳转页面时添加header
  12. config parser 模块
  13. class-dump 使用
  14. Evolution(矩阵快速幂)zoj2853
  15. hibernate--一级和二级缓存(使用Ehcache)以及查询缓存
  16. Java中线程同步的方法
  17. 在服务器端判断request来自Ajax请求(异步)还是传统请求(同步)
  18. Http请求中Content-Type
  19. hadoop 集群配置--增加减少新的机器不重启
  20. Error : getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443

热门文章

  1. 【linux驱动笔记】字符设备驱动相关数据结构与算法
  2. javascript笔记整理(数据类型强制/隐式转换 )
  3. C++内存管理(超长)
  4. Delphi XE7下如何创建一个Android模拟器调试
  5. 基于visual Studio2013解决C语言竞赛题之1015日期计算
  6. Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity
  7. CentOS下利用sshpass不用手动输入密码远程执行命令
  8. Tomcat设置成NIO时,使用的线程池
  9. sqlserver 存储过程实例
  10. C# / MSSQL / WinForm / ASP.NET - SQLHelper中返回SqlDataReader数据