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

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

272

被折叠的 条评论
为什么被折叠?



