传送门1
传送门2
传送门3
写在前面:就我看来,这是一道不错的题
思路:
一.对于“求总长度最大的一段的长度最小值”这个问题,我们比较容易想到二分答案然后判断是否合法,显然这个是可以直接贪心搞的,记录前缀和,从1-n枚举,一旦这一段长度超过mid就砍,并重新计算长度,直到某一单木棍长度超过mid或砍得超过m次,返回非法,否则合法
二.“有多少种砍的方法”这个问题着实让我纠结了很久,最后想出来一个三维DP,记录前i个木棒砍j次并且最后一个砍的地方是k,但显然时间和空间复杂度都是不能承受的,后来知道其实可以去掉k维,DP方程为
f[i][j]=Σ(f[k][j−1])(要求sum[i]−sum[k]>=minn)f[i][j]=Σ(f[k][j-1]) (要求sum[i]-sum[k]>=minn)
就现在看,但这个二维DP的空间复杂度仍是很可怕的,如果我们用short存储(因为答案要mod10007),内存也会达到96M,同时我们要用三个循环控制变量,时间复杂度O(n*n*m),这是必定超时的,那么我们就要对这个DP进行优化
1.首先我们发现对于每一个i来说,k的最小值是固定不变的,即每次我们对f[i][j]加的即是Σ(f[p][j-1])(k<=p<=i-1),那么我们可以在对于每一个j求出一趟后维护一下区间值,争取在较短时间内调出f[i-1][j-1]到f[k][j-1],显然我们可以对每个j求一次f[1][j-1]到f[n][j-1]的前缀和,复杂度为O(n),那么我们就可以顺利在O(n)时间转移所有f[i][j](对于k的求法,我们有一个伪O(n*n)的方法,但实际效果要比n*n快很多),DP的总转移时间就由O(n*n*m)变成了O(n*m)
2.其实题目到这里就可以A了,但空间复杂度很难看,反而还加了一个存前缀和的数组,但我们在存前缀和的时候肯定不是开n*m的数组,同样我们就联想到了对于该题的DP方程我们同样不必开n*m的数组,由于每次转移只用到j-1的状态,所以我们可以改成滚动数组,同样前缀和也是,至此,题目完成
注意:
1.初始化时,我们对所有前缀和小于等于二分出的答案的f[i][0]=1,其他为0
2.转移时f[i][x]一定是赋值而不是+=,因为开的是滚动数组
3.小心越界,一生平安

#include<bits/stdc++.h>
#define mod 10007
using namespace std;
int n,m,minn,ans,x;
int f[50010][2],g[50010][2],pos[50010],len[50010],sum[50010];
inline bool check(int x)
{int k=0,tot=0;for (int i=1;i<=n;i++)if (sum[i]-sum[k]>x){if (len[i]>x||tot==m) return 0;tot++;k=i-1;}return 1;
}
main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)scanf("%d",&len[i]),sum[i]=sum[i-1]+len[i];int l=1,r=sum[n],mid=(l+r)>>1;while (l<=r){if (check(mid)) minn=mid,r=mid-1;else l=mid+1;mid=(l+r)>>1;}for (int i=1;i<=n;i++)if (sum[i]<=minn) f[i][0]=1;else break;for (int i=1;i<=n;i++){if (sum[i]<=minn) continue;for (int j=i-1;j>=0;j--)if (sum[i]-sum[j]>minn) {pos[i]=j+1;break;}}while (m--){for (int i=1;i<=n;i++)g[i][x]=g[i-1][x]+f[i][x];x^=1;for (int i=1;i<=n;i++)f[i][x]=(g[i-1][!x]-g[max(pos[i]-1,0)][!x])%mod;ans=(ans+f[n][x])%mod;}printf("%d %d",minn,ans);
}

【BZOJ1044】【tyvj3511】【codevs1870】木棍分割,二分答案+滚动数组+前缀和DP相关推荐

  1. 【bzoj1044】[HAOI2008]木棍分割 二分+dp

    题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且 ...

  2. [BZOJ4556][TJOI2016HEOI2016]字符串(二分答案+后缀数组+RMQ+主席树)

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1360  Solved: 545 ...

  3. BZOJ1044: [HAOI2008]木棍分割 (二分 + DP)

    题意:n根木棍依次连在一起 最多切m个端点 使得最长的一段最小 在保证最长的最小的情况下 有多少种不同的切法 题解:第一问傻子都知道二分 第二问想了一会不会做 但其实就是很简单的dp dp[i][j] ...

  4. poj 1743 二分答案+后缀数组 求不重叠的最长重复子串

    题意:给出一串序列,求最长的theme长度 (theme:完全重叠的子序列,如1 2 3和1 2 3  or  子序列中每个元素对应的差相等,如1 2 3和7 8 9) 要是没有差相等这个条件那就好办 ...

  5. 2019多校第一场 HDU6578 - Blank(DP,思维,滚动数组优化空间)

    链接:HDU6578 - Blank 题意: 有 n (≤100) 个格子,向其中填入 0.1.2.3 这4个数,但是有 m (≤100) 个限制 限制 l r x :表示 l ~ r 的格子内不同的 ...

  6. hdu 1024(滚动数组优化)

    本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题. 解题思路:dp[i][j]表示前j个数分成i组,且j在第i组里的最大值. dp[i][j] = max{dp[i][j-1]+a[ ...

  7. 滚动数组~\(≧▽≦)/~

    今天第一次用了滚动数组,缘由要从一道题说起:POJ 1159 Palindrome 题意:给你一个字符串,求对字符串最少添加几个字符可变为回文串. 分析: 简单做法是直接对它和它的逆序串求最长公共子序 ...

  8. Top Secret Task(dp+滚动数组)

    传送门: 题目 dp[i][j][k] 表示 考虑到第i个数 计算前j个数的和 进行了k次操作 则有 若不把第i个数放入前j个数中 dp[i][j][k] = dp[i-1][j][k] 若把第i个数 ...

  9. 01背包:经典DP问题( 基本/滚动数组(优化)/恰好装满 )

    所谓01背包问题,是指对于一定数量( i )的物品有一个容量为( j )的背包,每个物品都有自己的容量( k ).价值(value).在保证物品容量之和不大于背包容量的前提下,如何选取物品得到最大价值 ...

最新文章

  1. 查看SQL Server被锁的表以及如何解锁
  2. 实训C++语言设计——Date日期系统实现
  3. php和java融合_Java上的PHP,真的融合
  4. Jenkins Pipeline动态使用Git分支名称的技巧
  5. 实训23 2018.4.27
  6. mysql 命令 pdf_MySQL命令文档 PDF 下载
  7. 永恒python图片_python 数据词云展示实例(3)- 背景图设置
  8. C语言实现静态顺序表
  9. rowdata java_Java RowDataUtil.addRowData方法代碼示例
  10. Eclipse中Program arguments和VM arguments的说明
  11. python并行计算_Python并行计算初探
  12. 目标检测(Object Detection)的整理
  13. 如何改变图片容量大小不影响清晰度
  14. 群晖DSM Docker下Xware迅雷远程下载教程
  15. jvm参数调优_3_问题排查
  16. 网站侵权服务器在国外,中国电影史上最大泄露事故 侵权网站服务器在境外
  17. (八)JVM成神路之GC分区篇:G1、ZGC、ShenandoahGC高性能收集器深入剖析
  18. java代码输出万年历
  19. 如何运用netoffice,开发兼容多个版本的outlook插件
  20. 天地图加载403错误

热门文章

  1. 鲲鹏云实验-.NET Core 3.0-开始使用
  2. 共享共建会让中国的5G加速吗?
  3. Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...
  4. iphone7测试软件,iPhone7如何测试网速 ping命令测试网速方法介绍
  5. 米莱迪机器人加物理攻击_王者荣耀:“不死流”白起崛起,秒回8500血完克米莱迪...
  6. Think in Java第四版 读书笔记5第11章
  7. poj 2502 Subway md自闭了,之后再看吧f**k
  8. 天正lisp文件路径_AutoCAD的文件组织形式和搜索路径 | 坐倚北风
  9. Swagger:Rest API的描述语言
  10. 从WordCount看Spark大数据处理的核心机制(2)