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 行的所有的可以放的情况,那么对于 ...
随机推荐
- Exchange Powershell:ForwardingAddress&InboxRule
查询在邮箱上设置的转发功能: Get-Mailbox -server MX01 -Filter {ForwardingAddress -like '*'} | Select-Object Name, ...
- 【Python之路】第十二篇--JavaScript
JavaScript 历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) Net ...
- FW: Dockerfile RUN, CMD & ENTRYPOINT
Dockerfile RUN, CMD & ENTRYPOINT 在使用Dockerfile创建image时, 有几条指令比较容易混淆, RUN, CMD, ENTRYPOINT. R ...
- 我的Android进阶之旅------>Android自定义View实现带数字的进度条(NumberProgressBar)
今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢 ...
- 我的Android进阶之旅------>解决:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
错误描述 今天在Android Studio项目中加入了jackson的开发包,编译运行时候,引发了如下的错误: Error:Execution failed for task ':app:trans ...
- DRF(5) - 频率组件、url注册器、响应器、分页器
一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...
- 48dp rhythm
- Java中对Clone的理解
面试中经常遇到Clone的相关知识,今天总算是把Clone理解的比较透彻了!Java中Clone的概念大家应该都很熟悉了,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看java中的Cl ...
- Python(迭代、三元表达式、列表生成、生成器、迭代器)
迭代 什么是迭代 1 重复 2 下次重复一定是基于上一次的结果而来 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). ...
- 学会这些你就是Android 开发高手了!
世界范围内,很多移动设备都是Android系统,Android开发可以说很有前景.对于安卓开发者来说,如果有个地方可以找到Android开发所有的资料,不需要一个网站一个网站的搜索,简直是件很开心的事 ...