博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nyoj 742 子串和再续 类似 HDU 1024
阅读量:6446 次
发布时间:2019-06-23

本文共 1681 字,大约阅读时间需要 5 分钟。

子串和再续

时间限制:
1000 ms  |  内存限制:
65535 KB
难度:
4
描述
给你一个序列 S1, S2, S3, S4 ... Sx, ... Sn (1 ≤ x ≤ n ≤ 1,000,000, -32768 ≤ Sx ≤ 32767). 我们定义
sum(i, j) = Si + ... + Sj (1 ≤ i ≤ j ≤ n).现在给你一个 m(8>m>0&&m<n)你的任务是计算
sum(i1, j1) + sum(i2, j2) + sum(i3, j3) + ... + sum(im, jm) ;我们规定他是不相交的。
请输出m段最大和,比如:m = 2,n = 6 ,{-1 4 -2 3 -2 4} 它的结果是 9;
输入
输入 T,表示T组数据
第二行 分别是m,n;
输出
请输出m段最大和
样例输入
12 6-1 4 -2 3 -2 4
样例输出
9

PS:给定n个数求这n个数划分成互不相交的m段的最大m子段和。

   经典的动态规划优化的问题。设f(i, j)表示前i个数划分成j段,且包括第i个数的最大m子段和,那么有dp方程:
       f(i, j) = max { f(i - 1, j) + v[i], max {f(k, j - 1) + v[i]}(k = j - 1 ... i - 1) }
  也就是说第i个数要么自己划到第j段,要么和前一个数一起划到第j段里面,转移是O(n)的,总复杂度O(n * n * m)。
  可以引入一个辅助数组来优化转移。设g(i, j)表示前i个数划分成j段的最大子段和(注意第i个数未必在j段里面),那么递推关系如下:
       g(i, j) = max{g(i - 1, j), f(i, j)},分是否加入第i个数来转移
  这样f的递推关系就变成:
    f(i, j) = max{f(i - 1, j), g(i - 1, j - 1)} + v[i],转移变成了O(1)
  这样最后的结果就是g[n][m],通过引入辅助数组巧妙的优化了转移。实现的时候可以用一维数组,速度很快。

AC代码:

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 using namespace std;10 const int N=1e6+5;11 const int INF=-0x7ffffff;12 int g[N],f[N],a[N];13 int max_sum(int m,int n)14 {15 int i,j,t;16 for(i=1; i<=n; i++)17 {18 t=min(i,m); //最大才m组,所以j不能大于t;19 for(j=1; j<=t; j++)20 {21 f[j]=max(f[j],g[j-1])+a[i];22 g[j-1]=max(g[j-1],f[j-1]);23 }24 g[j-1]=max(g[j-1],f[j-1]);25 }26 return g[m];27 }28 int main()29 {30 int i,j,k,t,m,n;31 cin>>t;32 while(t--)33 {34 cin>>m>>n;35 g[0]=f[0]=0;36 for(int i=1; i<=n; i++)37 {38 cin>>a[i];39 f[i]=g[i]=INF;//全部初始化为 最小值40 }41 cout<
<

 

转载于:https://www.cnblogs.com/lovychen/p/3711629.html

你可能感兴趣的文章
前端实现html转pdf方法总结
查看>>
python综合学习三之Numpy和Pandas
查看>>
ECMAScript6(12):Proxy 和 Reflect
查看>>
koa-router源码学习
查看>>
egg学习笔记(6)--egg+mysql(sequelize)+vue实现curd
查看>>
Laravel源码解析之路由的使用
查看>>
实战Vue简易项目(4)定义视图
查看>>
MongoDB4.0 在windows中安装与配置
查看>>
如何正确的提问题
查看>>
关于 phantomJS 请求url driver.current_url 为 about:blank
查看>>
人工智能发展速度超过多数人想象
查看>>
将Java应用部署到SAP云平台neo环境的两种方式
查看>>
204. Count Primes
查看>>
响应式布局的常用解决方案对比(媒体查询、百分比、rem和vw/vh)
查看>>
前端每日实战:46# 视频演示如何用纯 CSS 创作一个在容器中反弹的小球
查看>>
Objective-C语法总结
查看>>
工程篇前传
查看>>
使用Network Recycle Bin启用映射网络驱动器上的回收站
查看>>
javascript实现数据结构中的栈结构
查看>>
使用travis进行持续集成golang项目
查看>>