动态规划:最长下降子序列

题目描述:

给你一串整数,从左到右按顺序挑出一些数字,构成严格下降序列,问最长能构成多长
如6个数4 5 2 4 2 2, 那么最长可以挑出5 4 2,长度为3。

一道很经典的dp。

选用dp[]来存放答案,用a[]来存放数据。

第一步,确定dp[i]的意义。这里我们可以认为其表示以a[i]为起点的最长下降子序列的最大长度。

那么当我们求出所有的dp[i]之后,遍历并求最大值即可。

第二步,确定递推公式。可以选择从前往后遍历,那么对于小于i的任意j,

如果a[i]

第三步,考虑如何初始化(考虑边界及各元素的初始值)对于每一个a[i],它都是子序列的一部分,所以我们应该让初始值都为1;

第四步,确定遍历顺序。外层循环是很清楚的,x从1到数组末尾,用来遍历并存放dp[].

那么对于内层循环呢?众所周知,dp中很重要的一环就是记忆化,所以对于内循环,我们同样选择正向遍历,即for(int j=1;j

完整代码:

#include
using namespace std;
int n,t;
int mas[10009];
int k[10009]; 
int main()
{
    cin>>n;
    while(n--){
        cin>>t;
        for(int i=1;i<=t;++i) cin>>mas[i];
        for(int i=1;i<=t;++i){
            k[i]=1;
            for(int j=1;jk[i])
                k[i]=k[j]+1;
            }
        }
        int maxn=k[1];
        for(int i=1;i<=t;++i){
            maxn=max(maxn,k[i]);
        }
        cout<

时间复杂度为O(n*n).

你可能感兴趣的:(动态规划,算法)