DP问题如何确定状态
2017-08-03 01:40
120 查看
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个乘号的最优解
今天太晚,明天继续
相关文章推荐
- hdu 2844 多重背包的转化问题 以及这个dp状态的确定
- HDU4114 Disney's FastPass(floyd+状态压缩DP)旅游问题升级(难)
- 求助:TelephonyManager.listen 监听使用的问题--如何实现TM同时监控多个状态的改变
- 非托管C++调用 Webservice,如何解决状态保持的问题
- 状态压缩dp入门--------TSP问题
- 【上海交大oj】邮递员小F(状态压缩dp)(旅行商问题)
- 如何根据字节流内容确定汉字编码,从而解决相同App在部分省份显示乱码的问题
- codeforces 626F DP 如何设置状态,方便转移
- 动态规划(DP)问题状态方程合集
- 如何确定Kafka的分区数,key和consumer线程数,以及不消费问题解决
- 如何根据标注图中的px确定dp
- 搞清了两个问题: 查询TCP端口状态 以及 如何弹出右键菜单
- [Android开发常见问题-5] 如何检测耳机的插入状态
- web面试中,遇到无数次的问题“无状态的HTTP协议如何提供有状态的连接”?
- jzoj5259 线性规划问题 (巧妙设状态的dp)
- HDU3768 Shopping(状态压缩DP+spfa)旅行商问题
- POJ 1321 棋盘问题(状态压缩DP | DFS)
- c#中如何避免Button,CheckBox等的点击状态时的焦点矩形框问题:
- POJ 3311 Hie with the Pie (状态压缩DP ,TSP问题)
- 旅行商问题 —— 状态压缩DP