主页 > 手机  > 

DP-最长上升子序列

DP-最长上升子序列
题面:

样例:

思路:

遇到动态规划问题,我们照旧思考两部分,状态表示以及状态计算。这里我们f[N]表示以第i个数结尾的上升子序列的最大值。我们将f[N]划分为若干个部分,因为我们要用到递推思路想办法用前面的来表示这一个,所以我们自然而然地可以想到用上升子序列中的前一个数进行分类。前一个数是序列中的第一个数,第二个数以此类推直到第i-1个数。我们就可以得到状态计算方程。f[i]就可以分为这些部分的“和”然后求最大值。

代码: #include<iostream> using namespace std; const int N = 1010; int n; int a[N]; int f[N]; int main(void) { cin >> n; for(int i = 1;i <= n;i++) cin >> a[i],f[i] = 1; for(int i = 1;i <= n;i++) for(int j = 1;j < i;j++) if(a[j]<a[i]) f[i] = max(f[i],f[j]+1); int cnt; for(int i = 1;i <= n;i++) cnt = max(cnt,f[i]); cout << cnt << endl; return 0; } tips:

需要注意的是,我们划分的那些部分不一定是每一部分都有的,必须要满足前一个小于a[i]这个条件。其次我们在状态计算的时候,一定要加上1,因为前面的还有这个数它自身。

标签:

DP-最长上升子序列由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“DP-最长上升子序列