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个乘号的最优解

 

今天太晚,明天继续

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值