动态规划解题思考

一点思考

思考问题的结果是什么 然后就设你的状态是什么意义
并且根据状态确定转移方程

其中状态数组的确定要注意长度 和 整体的初始值 以及0等边界的赋值
进入双层for循环 或者单层的for循环 外层的循环从i=1开始了 因为0等边界已经在外边赋值过了

因为动态规划的核心就是 你到当前的点就是一次选择 他还让你站在当前的选择去进行其他选择
所以进入外层循环 之后 自己来处理 二维抉择是不用for循环就可以解决
还是要借助 并且在二维抉择当中经常要有判断和防御

最后返回的是状态的最后一个值


有关于状态的确定
比较清晰能加深你印象的就是
跳跃游戏 和 路径 可以清晰看到状态数组的类型 维度 的多种情况

有关于初始值你也能通过以上两道题 看出来必须要设置全局的初始值


对于我所描述的每一个人站在自己的当前位置 还要做二次的选择这一点
可以在不同路径II I 就可以看到在走到当前位置 继续往下走的时候由于面临着许多的路障 所以二次选择有很大的不同 II就需要做很多的条件选择


所有的情况都要记得对边界值 0 等 进行赋值 因为这是动态规划的最初子结构
特殊情况 如跳跃游戏这种boolean 或者换零钱这种要进行比较大小进行赋值的要记得初始为最大值 或者最小值 初始为全true等
并且这些特殊情况要记得对范围 等 进行判断 不要最大值还+1
通常特殊情况要进行的条件判断更多

换硬币的这个题的赋值是非常常见的 a在变换的题

for(int j=0;j<5;j++)
{
int a =Math.max(a,a+conis[j]);
}
序列形动态规划

最优解的结果是辅助变量res 不是右下角或者数组的最后一位了
原因是 坐标形动态规划承接子问题的最优结果
但是序列形每一步不会覆盖最优结果 也不会承接上一个最优结果
过程中的最优结果都存在res中 不像坐标一直覆盖
最后返回res即可 同时说明以自己为结尾的序列形并不被最优解覆盖
而是如果自身不是最优解 自身就是那个LOW解 彼此之间会断开联系 坐标不会断开 会一直保持着传递最优的习惯

可以做一下最长上升子序列 和 最长连续上升子序列
唯一的区别就是最长连续上升子序列是和i-1比较
不连续的是和[0,i-1]比较 并且再比较的时候做一个预判 不要让比自己小但是并没有现在的f[i]大的替换现在的f[i]

双序列形动态规划

和上面的不同就是状态是二维的
状态的长度要紧的还是在字符串的题当中 我们尽量使用m+1 n+1
因为前0个字符串就是空串 进行状态的定义很简便
如果是真的以F[0]为结尾进行比较 那就要详细比较两个序列的第一个值的具体情况
如果全都设定为前i个的意义
所以if(A[i-1]==B[j-1])f[][]=f[i-1][j-1]+1

状态意义还是前i-1的结果 最后返回的还是f[m]
需要注意的就是 字符串中一般


双序列化 要紧的就是是否要A的最后一个 是否要B的最后一个 是否两个都要

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值