本蒟蒻的写法和各位佬的写法可能不同,多多指教
我们知道,动态规划有很多类型!
那么,今天我们来讲解——最长上升子序列!
动态规划简称 DP/dp(dynamic programming)
题目
在学习动态规划之前,我们要先学会几个步骤:
1.把一个大问题拆分成多个小问题
2.推导状态转移方程
3. 考虑边界问题
那么,这道题的状态转移方程是什么呢?
别慌!我来带你慢慢推导!
(如果前面任意一个数比他小,并且是比他小里面,下方数值最多的,那么这个数=比他小里面,下方数值最多的)
13 | 7 | 9 | 16 | 38 | 24 | 37 | 18 | 44 | 19 | 21 | 22 | 63 | 15 | |
无 | 1 | 1 | 2 | 3 | 4 | 4 | 5 | 4 | 6 | 6 | 7 | 8 | 7 | 3 |
不难发现,状态转移方程是:
dp[i]=max(dp[i],dp[j]+1);
(注:如果用我的思路的话,在第一层循环结束时还要判一次最大值!)
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[1005],dp[1005],mxx=0;
cin>>n;
dp[1]=1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
dp[i]=1;
for(int j=1;j<i;j++)
{
if(a[i]>a[j])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
mxx=max(dp[i],mxx);
}
cout<<mxx;
return 0;
}