CF229D 动态规划dp
因为我菜所以只能想到消耗空间大,时间复杂度差的做法但是我就是要发!!
首先这种题需要知道他是个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相关推荐
- 第4课 防卫导弹(第十章 动态规划--DP)
//progream p10_04 /* 第4课 防卫导弹(第十章 动态规划--DP) (<聪明人的游戏--信息学探秘 提高篇>) https://blog.csdn.net/weixi ...
- 动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包,混合背包
动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包 01背包 && 完全背包 && 分组背包 の 视频教程:https://www.bilibi ...
- 【习题详解】动态规划DP:硬币游戏 蛋糕 游荡的奶牛 决斗
动态规划DP 硬币 蛋糕塔 游荡的奶牛 格斗 硬币 题目描述 农夫约翰的奶牛喜欢玩硬币游戏,因此他发明了一种称为"Xoinc"的两人硬币游戏. 初始时,一个有N(5 <= N ...
- 动态规划: dp+递推——确定动态矩阵dp含义,确定每个状态下面临的选择和对结果值影响,选择符合题意的作为结果存储在dp中
1.动态规划:每一个状态一定是由之前的状态推导出来的,通过总结归纳发现递推关系 2.解决动态规划问题的步骤: 确定dp数组(dp table)以及下标的含义: 每个单元内 题目所求的值,一维.二维 确 ...
- Datawhale编程——动态规划DP
0-1背包问题 问题:有n个物品,第i个物品价值为vi,重量为wi,其中vi和wi均为非负数,背包的容量为W,W为非负数.现需要考虑如何选择装入背包的物品,使装入背包的物品总价值最大. 针对这个经典的 ...
- 《强化学习》中的 时序差分学习 Temporal-Difference Learning (基于与动态规划 DP 、蒙特卡洛方法 MC 的对比)
前言: 学习了 Sutton 的<强化学习(第二版)>中时序差分学习的"预测"部分内容.前两章中,书介绍了 动态规划 与 蒙特卡洛方法 ,我们从二者与 时序差分学习 的 ...
- HDU2571 命运【动态规划DP】
命运 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- 算法技能树2-蓝桥杯-python实现测试次数(摔手机)-动态规划(DP)
文章目录 1.题目描述 2.python解题 1.知识点总结 1.题目描述 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规 ...
- 动态规划(dp)总结
问题 T: [动态规划]质数和分解 题目描述 任何大于1的自然数n,都可以写成若干个大于等于2且小于等于n的质数之和的形式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式.例如9 ...
最新文章
- 项目的命名规范,为以后的程序开发中养成良好的行为习惯
- 《C程序员:从校园到职场》出版预告(1):从“高大上”到“柴米油盐”
- python 山脉数组的峰顶索引
- 求解ax + by = c 这类方程
- 《TCP/IP详解》学习笔记(五):IP选路、动态选路
- Python 实现邮件发送功能(进阶)
- 让Grub 2来拯救你的 bootloader
- Spring-jdbc-ConnectionHolder
- jsp页面ajax用法,JSP页面如何使用ajax实现局部刷新
- 拓端tecdat|Python Monte Carlo K-Means聚类实战研究
- Postman安装与入门简单教程
- 华为服务器型号分类,华为服务器型号介绍
- 注意力机制(Attention Mechanism)
- HTML5实现音频和视频嵌入,如何利用HTML5实现音频和视频嵌入的方法
- 希尔顿与锦江集团续签合作协议,将在华开逾600家希尔顿欢朋酒店
- ACM篇:UVA220黑白棋总结
- 2023年4月应急预案演练、应急处置知识
- 无功控制器电容投切方案整理
- linux取消线程的原理,linux线程的取消(终止)方法
- 抓包工具charles手机代理抓手机包教程