dp算法总结

本文深入探讨了动态规划(DP)算法的核心思想与应用实践,通过解析经典问题如最大上升子序列、最大公共子串及最大字段和,揭示了DP算法在解决复杂问题时的状态转移与递推特性。文章还分享了作者的学习感悟,强调了理解和应用DP算法的关键在于对问题本质的把握。

dp算法部分总结

个人感受:听了几次课做了几个题之后,觉得这个dp并不和之前的算法一样,是一种思想,要更加偏向于问题的分析,而代码只是表示问题解决的过程,虽然并没有做太多题,说实话,有时候根本想不出怎么进行状态转化,尽管看了题解也需要再花一些时间思考,并不容易理解透。先从简单入手,其实也是有最基本的模板类型的,比如最大上升子序列,最大公共子串等等,一些问题根本思想就是这个,只不过数据的处理要麻烦一些,比如有个题是数据的输出那个序号,还是没搞懂为什么那样做,总之,还是要继续体会,继续想,多动手写一写会比较好,有助于理解。

这类问题具体解决的时候还有个共性的东西,比如dp[i]表示前i个数据怎么样怎么样,然后再从这个具体展开 所谓的状态改变

具体的就举几个自己掌握的模板例子吧

1.最大上升子序列问题
分析:要找最大的,那就先找出以dp[i]作为结尾的上升序列,再取最大值即可

int main()
{
   
     
 int n,sum;
 for(int i=1;i<=n;i++)
    dp[i]=1;
    for(int j=2;j<i;j++)
      if(a[j]<a[i])
        dp[i]=max(dp[i],dp[j]+1);
cout<<dp[i]<<endl;
  

2.最大公共子序列
思想:dp[i][j] 表示A的前i个 和B的前j个 相同的个数
转态转移方程:if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i][j-1],dp[i-1][j])

3.最大字段和
思想 :dp[i]表示前i个数据的字段和

#include<iostream>
using namespace std;
int main()
{
   
   
    int dp[100];
    int sum=-1;
    int a[6]={
   
   5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值