因为我菜所以只能想到消耗空间大,时间复杂度差的做法但是我就是要发!!

首先这种题需要知道他是个dp(看不出来就GG),然后思考下怎么做,首先他是会进行区间合并,并且可以进行连续的合并,也就是把这个过程看做是一个连续区间合并的过程
例:
123456
[1,2] [3,4,5] [6]
可以将一个序列分解为若干个区间(区间长度可以为1),但是区间必须是连续的,不能说你1和3去合并在一起,这是不允许的。
知道他是这样一个过程后要干嘛呢,我们可以设计dp转态
设 f[i][j] 表示[1,i]的序列都合法后,第i个与前j个位置一起合并的最少次数,也就是区间[i-j+1, i]作为一个连续区间。
为什么是这样子记录呢,因为在dp中一个很常见的做法的第二维度记录的是第i个位置所代表的权值。但是在这道题里的问题是权值的取值范围是取决于输入数据,即使离散化后这个权值的取值范围也可能达到一个很大的量级,这会导致我们的空间炸掉。
所以就有了上述的状态转移方程,同样是记录那些状态,但是我们换了种表示方法。

接下来思考转移
我是区间[i-j+1, i]作为一个连续区间,那么我这个区间的权值是固定的,上一个区间的最后一个位置是i-j,那么我们在i-j所在区间是可以获取信息,i-j这个位置往前合并了1个,2个,3个。。。。。这个大小取决于什么时候拿的权值超过当前i的区间所代表的权值就不行了。然后观察每个位置的高都大于1,区间权值具有单调性。我们就对于i-j这个位置最多可以合并多少个位置是可以二分出来的。然后在先前记录一个答案的前缀min,就可以二分后O1的到答案。
复杂度就是O(n^2logn)

int N,f[max_][max_],sum[max_],value[max_][max_];
il int getsum(int L, int R) {return sum[R] - sum[L - 1];
}
il void update(int x) {value[x][0] = inf;for (int i = 1; i <= x; i++) {value[x][i] = min(value[x][i - 1], f[x][i]);}
}il int getv(int weizhi, int ht) {if (weizhi == 0)return 0; if (getsum(weizhi, weizhi) > ht)return inf;int L = 1, R = weizhi;while (L < R){int mid = ((L + R) >> 1) + 1;//[1,mid]//[weizhi,weizhi - mid + 1]if (getsum(weizhi - mid + 1,weizhi) <= ht)L = mid;else R = mid - 1;}//[1,R]return value[weizhi][R];
}
signed main() {N = read();for (int i = 1; i <= N; i++) {sum[i] = read();sum[i] += sum[i - 1];}memset(f, 127, sizeof(f)); memset(value, 127, sizeof(value));f[1][1] = 0; update(1);for (int i = 2; i <= N; i++) {for (int j = 1; j < i; j++) {//[i-j+1,i]f[i][j] = getv(i - j, getsum(i - j + 1, i)) + j - 1;}f[i][i] = i - 1;update(i);}int ans = inf;for (int i = 1; i <= N; i++) {ans = min(ans, f[N][i]);}printf("%d", ans);return 0;
}

CF229D 动态规划dp相关推荐

  1. 第4课 防卫导弹(第十章 动态规划--DP)

    //progream p10_04 /* 第4课 防卫导弹(第十章 动态规划--DP)  (<聪明人的游戏--信息学探秘 提高篇>) https://blog.csdn.net/weixi ...

  2. 动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包,混合背包

    动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包 01背包 && 完全背包 && 分组背包 の 视频教程:https://www.bilibi ...

  3. 【习题详解】动态规划DP:硬币游戏 蛋糕 游荡的奶牛 决斗

    动态规划DP 硬币 蛋糕塔 游荡的奶牛 格斗 硬币 题目描述 农夫约翰的奶牛喜欢玩硬币游戏,因此他发明了一种称为"Xoinc"的两人硬币游戏. 初始时,一个有N(5 <= N ...

  4. 动态规划: dp+递推——确定动态矩阵dp含义,确定每个状态下面临的选择和对结果值影响,选择符合题意的作为结果存储在dp中

    1.动态规划:每一个状态一定是由之前的状态推导出来的,通过总结归纳发现递推关系 2.解决动态规划问题的步骤: 确定dp数组(dp table)以及下标的含义: 每个单元内 题目所求的值,一维.二维 确 ...

  5. Datawhale编程——动态规划DP

    0-1背包问题 问题:有n个物品,第i个物品价值为vi,重量为wi,其中vi和wi均为非负数,背包的容量为W,W为非负数.现需要考虑如何选择装入背包的物品,使装入背包的物品总价值最大. 针对这个经典的 ...

  6. 《强化学习》中的 时序差分学习 Temporal-Difference Learning (基于与动态规划 DP 、蒙特卡洛方法 MC 的对比)

    前言: 学习了 Sutton 的<强化学习(第二版)>中时序差分学习的"预测"部分内容.前两章中,书介绍了 动态规划 与 蒙特卡洛方法 ,我们从二者与 时序差分学习 的 ...

  7. HDU2571 命运【动态规划DP】

    命运 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  8. 算法技能树2-蓝桥杯-python实现测试次数(摔手机)-动态规划(DP)

    文章目录 1.题目描述 2.python解题 1.知识点总结 1.题目描述 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规 ...

  9. 动态规划(dp)总结

    问题 T: [动态规划]质数和分解 题目描述 任何大于1的自然数n,都可以写成若干个大于等于2且小于等于n的质数之和的形式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式.例如9 ...

最新文章

  1. 项目的命名规范,为以后的程序开发中养成良好的行为习惯
  2. 《C程序员:从校园到职场》出版预告(1):从“高大上”到“柴米油盐”
  3. python 山脉数组的峰顶索引
  4. 求解ax + by = c 这类方程
  5. 《TCP/IP详解》学习笔记(五):IP选路、动态选路
  6. Python 实现邮件发送功能(进阶)
  7. 让Grub 2来拯救你的 bootloader
  8. Spring-jdbc-ConnectionHolder
  9. jsp页面ajax用法,JSP页面如何使用ajax实现局部刷新
  10. 拓端tecdat|Python Monte Carlo K-Means聚类实战研究
  11. Postman安装与入门简单教程
  12. 华为服务器型号分类,华为服务器型号介绍
  13. 注意力机制(Attention Mechanism)
  14. HTML5实现音频和视频嵌入,如何利用HTML5实现音频和视频嵌入的方法
  15. 希尔顿与锦江集团续签合作协议,将在华开逾600家希尔顿欢朋酒店
  16. ACM篇:UVA220黑白棋总结
  17. 2023年4月应急预案演练、应急处置知识
  18. 无功控制器电容投切方案整理
  19. linux取消线程的原理,linux线程的取消(终止)方法
  20. 抓包工具charles手机代理抓手机包教程

热门文章

  1. 用友java面试题_用友网络科技Java高级开发面试题(2019)
  2. FANUC机器人SRVO-348故障报警分析及处理对策
  3. flask 分布式蓝图_分布式系统架构蓝图:旋风之旅
  4. 解决springboot上传图片无法显示问题
  5. 连锁百货企业数据分析系统建设方案
  6. 长城欧拉,一个最伤女人“芯”的汽车品牌
  7. pass all options of select from View to controller
  8. win10一行命令查看所有wifi密码
  9. 移动端旅游报价日历插件
  10. 吐槽大会,加个好友,分享资源