DP问题如何确定状态
DP问题如何确定状态
一、dp实质
动态规划的实质就是通过小规模的同类型的问题来解决题目的问题。
所以有一个dp数组来储存所有小规模问题的解。
所以确定状态也就是缩小问题规模。
我们求解问题的一般规律就是:实例化,缩小化。
二、dp确定状态方法
1、明确题目中的问题
2、找出限制因子
3、缩小规模
4、根据前三个写出状态
三、实例
1、合并石子
题目大意:n堆石子,每次合并相邻的两堆,每次合并两堆的和作为代价,求将n堆石子合并成一堆的最小代价。
求解状态:
因为每次合并石子都是两堆,虽然它们是相邻的,合并的话可以向左也可以向右,所以用一维还是无法确定怎么合并。显然这里我们需要两维。
所以这里我们可以用i,j两个变量分别表示两个要合并的石子堆。
1)、明确题目中的问题
因为显然状态两维,我们用两维来描述题中问题:求将第1堆石子到第n堆石子合并成一堆的最小代价。
2)、找出限制因子
显然这个1和n就是限制因子
3)、缩小规模
现在将问题缩小规模(也就是将限制因子缩小规模):求将第i堆石子到第j堆石子合并成一堆的最小代价。(1<=i<=j<=n)
4)、综合
所以得到状态就是:f[i][j]表示第i堆石子到第j堆石子合并成一堆的最小代价。(1<=i<=j<=n)
5)、其它
如果这个状态不好确定初始和最终状态,或者这个状态很难写状态转移方程,那就需要换状态,换状态的一般方式就是增加维度。
2、乘积最大
题目大意:在一个长度为n的数字串s中插入k个乘号,使得乘积最大
举例:数字串123,k=1,可得最大乘积为12*3=36
求解状态:
1)、找出限制因子
显然n和k就是限制因子
2)、缩小规模
在一个长度为i的数字串中插入j个乘号,使得乘积最大(i<=n,j<=k)
3)、综合
所以状态就是:f[i][j]表示在一个长度为i的数字串中插入j个乘号的最优解
因为数字串有序,所以状态转移方程变成下面的:
f[i][j]表示在数字串s的前i个数字中插入j个乘号的最优解
今天太晚,明天继续
DP问题如何确定状态的更多相关文章
- 状压dp终极篇(状态转移的思想)
状压dp是将每种状态都压缩成用一个二进制串,然后利用位运算进行操作的dp,而凡是dp都需要进行状态转移 对于简单的dp问题只需要一个二维数组dp[ i ][ j ]就能解决 具体操作为首先把状态压缩为 ...
- 状压dp(总结)状态压缩
状压这个和二进制分不开关系 所以,对于二进制的熟悉是必不可少的技能 & 与操作,1不变,0变0 | 或操作,0不变,1变1 ^ 异或操作,0不变,1取反 - 取反操作,把每一个二进制位0 ...
- ZOJ 3812 We Need Medicine(dp、背包、状态压缩、路径记录)
参考:http://blog.csdn.net/qian99/article/details/39138329 参考的链接里说明得很好,注释也很好...thanks for sharing 朴素的想法 ...
- cf55D 数位dp记忆化搜索+状态离散
/* 漂亮数定义:可以整除任意数位上的数 求出区间[l,r]之间的漂亮数个数 因为 dp[i][j][k]:i位前模lcm的值是j,i位前lcm是k的漂亮数个数 */ #include<bits ...
- DP———6.两个状态之间的 处理
Tickets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- Codeforces 1303E. Erase Subsequences 代码(dp 字符串压缩一维状态优化)
https://codeforces.com/contest/1303/problem/E #include<bits/stdc++.h> using namespace std; ; i ...
- poj3311 Hie with the Pie (状态压缩dp,旅行商)
Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3160 Accepted: 1613 ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
- poj3254 状态压缩dp
题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法. 分析:假如我们知道第 i-1 行的所有的可以放的情况,那么对于 ...
随机推荐
- 数值和字符串相互转换(C++ 数据类型转换技巧)
类型转换是将一种类型的值映射为另一种类型的值.进行数据类型的转换. 是在实际代码编写中经常遇到的问题,特别是字符串和其他类型的转换. 1.将字符串转换为整数 (1).转换函数// 双精度函数doubl ...
- The Log: What every software engineer should know about real-time data's unifying abstraction
http://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-abo ...
- 对比MySQL,你究竟在什么时候更需要MongoDB(转)
译文:对比MySQL,你究竟在什么时候更需要MongoDB 原文链接: When Should I Use MongoDB rather than MySQL (or other RDBMS): Th ...
- django之单表操作
1.查询方法: <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs ...
- 内置模块(time、random、hashlib、os)
简介: 模块:本质上就是一个.py文件,使用其中的函数. 模块分为:内置函数.第三方模块.自定义模块. 今天学习的就是Python的内置函数. 回到顶部 一.time模块 1.时间的表示形式 在Pyt ...
- mysql 建立表之间关系 一对一 练习2
创建db5数据库 create database db5 charset=utf8; use db5; 例二:一个管理员唯一对应一个用户 用户表: id user password 1 egon xx ...
- hadoop编程:分析CSDN注冊邮箱分布情况
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jdh99/article/details/37565825 hadoop编程:分析CSDN注冊邮箱分 ...
- 0505-Hystrix保护应用-Turbine集群状态监控
https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_turbine
- MySQL查询操作
查询执行路径中的组件:查询缓存.解析器.预处理器.优化器.查询执行引擎.存储引擎SELECT语句的执行流程: FROM Clause --> WHERE Clause --> GROUP ...
- Remote System Upgrade With Cyclone III Devices
系统设计者会遇到较短的设计周期.标准发展和系统调度的挑战,飓风III系列支持远程系统更新,通过其固有的重编程功能和专有电路来克服以上问题.远程系统更新帮助传递系统性能增强和bug修复,避免了昂贵的召回 ...