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 行的所有的可以放的情况,那么对于 ...
随机推荐
- kafka_2.11-0.10.1.1集群搭建安装配置
在搭建kafka集群之前,请保证zookeeper已安装. 1.下载 官网下载链接:http://mirrors.tuna.tsinghua.edu.cn/apache/kafka/0.10.1.1/ ...
- Windows服务的调试
1.服务为其他程序调用的情况:首先停止服务,在项目中设置断点,重新启动服务,点击项目中工具,附加到进程,运行调用服务的程序,即可进入之前设置的断点,进而进行调试. 2.服务内方法为自动执行的情况:首先 ...
- sklearn.svm包中的SVC(kernel=”linear“)和LinearSVC的区别
参考:https://stackoverflow.com/questions/45384185/what-is-the-difference-between-linearsvc-and-svckern ...
- 洛谷 P2300 合并神犇
洛谷 听说这题可以\(n^2\)水过去,不过这里介绍一种\(O(n)\)的做法. \(f[i]\)为第\(1-i\)位合并的次数. \(pre[i]\)为第\(1-i\)位最末尾的数. \(j\)为满 ...
- 我的Android进阶之旅------>Android关于HttpsURLConnection一个忽略Https证书是否正确的Https请求工具类
下面是一个Android HttpsURLConnection忽略Https证书是否正确的Https请求工具类,不需要验证服务器端证书是否正确,也不需要验证服务器证书中的域名是否有效. (PS:建议下 ...
- 假设做一个精美的Login界面(攻克了一EditText自带clear的功能,相似iphone的UITextField)
先上图: XML为: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...
- C#设置当前程序通过IE代理服务器上网
注意:以下设置只在当前程序中有效,对IE浏览器无效,且关闭程序后,自动释放代码. using System; using System.Collections.Generic; using Syste ...
- 学员管理系统(简单的Django设计)
学员管理系统(简单的Django设计) 学员管理系统 项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求.因此公司 ...
- Delphi 正则表达式语法(1): 关于大小写与中文
Delphi 正则表达式语法(1): 关于大小写与中文 //替换一般字符串 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); ...
- 开发者需要知道的iOS 12
总体概况 iOS 12总体来看是对现有iOS的一次改进,并没有太多突破性的功能或者框架,但是Apple在底层做了很多优化的工作,优化了性能,提供了更强大的安全性,增强了AR.Siri体验,让人工智能更 ...