动态规划/dp学习

先说一下我最近学习的感受:

现在开始了动态规划的学习,较之前的贪心算法,难度提高了。主要是问题难分析、思路难想…贪心果然是最简单的一种算法。dp问题暂时没找到什么既具体详实又普适性高的规律,只有一点基本概念的理解,对此老师给出的建议有点硬核,就是硬做。熟能生巧,培养自己做题的感觉,革命尚未成功,同志仍需努力。

我对于动态规划的一点理解:

动态规划的基本思路就是穷举,在最优子结构和无后效性的前提下,分阶段列举出所有情况,最终找到符合自己所要求的那组数据。
因为前一阶段的决策会影响后一阶段的决策,难点就在于状态转移方程的确定和寻找边界条件,在做dp题中,递推的思想很重要。

小技巧:

我们在做dp题的时候,一定会用到数组(一维数组或二维数组都有可能)和循环(一重循环和二重循环都有可能),在处理大的数据时,空间复杂度和时间复杂度就可能会很大,所以一点小小的优化是必要的。
空间复杂度的优化:滚动数组的应用;
时间复杂度的优化:记忆化搜索;

经典例题:

复杂问题大部分可转化为简单问题,几个经典例题,能变形应用于大多数的题目中。
1.最长上升子序列:
输入一行数据,求长度最大的上升子序列:
状态设计:
dp[i]代表以a[i]结尾的LIS的长度 ;
状态转移方程:
dp[i]=max(dp[i], dp[j]+1)
边界处理:
dp[i]=1 ;
2.最长公共子序列:
给出两个字符串A,B,求两字符串的最长公共子序列;
状态设计:
dp[i][j]代表以a[i],b[j]结尾的LCS的长度 ;
状态转换方程
if(s1[i]==s[j])
dp[i][j]==d[i-1][j-1]+1;
if(s1[i]!=s2[j])
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
边界处理:
dp[i][0]=0 ;dp[0][j]=0;
3.最长字段和问题
给出一个序列,从该序列中取出一连续的子串使其最大;
状态设计:
dp[i] (1 <= i <= N) 表示以 a[i] 结尾的最大连续子段和。
状态转移方程:
dp[i] = max{a[i],0} (i = 1)
dp[i] = max{dp[i-1] + a[i], 0} (2 <= i <= N)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值