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 行的所有的可以放的情况,那么对于 ...
随机推荐
- Outlook Top of Information Store
Actually I got to thinking this might make a good blog post so I took a closer look - Try this: On t ...
- 修改jquery.automeplete,使其支持value匹配
原生只会去匹配label,可在实际使用中,可能需要匹配的值并不需要显示在label中,经过添加一个matchType属性解决 1.加入matchType选项,并默认为原生匹配 $.widget(&qu ...
- html常见兼容性问题
html常见兼容性问题? 1.双边距BUG float引起的 使用display 2.3像素问题 使用float引起的 使用dislpay:inline -3px 3.超链接hover 点击后失效 ...
- 5.MongoDB CRUD Operations-官方文档摘录
总结 1. CRUD:create, read, update, and delete DOCUMENT 2.在3.2版本的插入方式 db.collection.insertOne() db.coll ...
- Python高级教程-切片
Python中的切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['A','B','C','D'] 对经常取指定索引范围的操作, ...
- servlet中获取各种相对地址(服务器、服务器所在本地磁盘、src等)。
[本文简介] 本文将提供javaWeb中经常使用到的相对路径的获取方法,分别有: url基本地址 带目录的url地址 服务器的根路径 服务器所在的 本地磁盘路径 服务器所在的本地磁盘路径,带文件夹 S ...
- web前端编码规范
简要介绍 本文通过参考百度腾讯等前端编码规范(链接建文末),得出个人习惯的编码规范.个人编码规范采用在不影响可读性的情况下能省就省,尽量简洁,不需要就直接去掉. 最佳原则不管是个人编码规范还是团队编码 ...
- 转:探索C++0x: 1. 静态断言(static_assert)
转自:http://www.cppblog.com/thesys/articles/116985.html 简介 C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做 ...
- mysql的-F与master-data理解(一个小型的big-log恢复)
例子: 使用mysqlbin-log恢复,有两种情况,一个是停数据库,一个是不停 在不停数据库的情况下,为了防止新的写入,需要将bin-log切割,然后新的数据会保存在新的bin-log里面 在此之前 ...
- LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: --异常记录
升级了JDK之后,启动应用,直接抛出此异常.网上搜罗半天,没有正确的解决方案. 然后想到了是“升级了JDK”,重新检查所有JDK相关的配置的地方,在Debug Configurations里找到启动时 ...