最长递增子序列,最长,进一步要给出一个序列(动态规划)

牛客网

https://www.nowcoder.com/question/next?pid=1669710&qid=44731&tid=11335790


给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)
例如:给定一个长度为8的数组A{1,3,5,2,4,6,7,8},则其最长的单调递增子序列为{1,2,4,6,7,8},长度为6.

输入描述

第一行包含一个整数T,代表测试数据组数。

对于每组测试数据:

N-数组的长度

a1 a2 ... an (需要计算的数组)

保证:

1<=N<=3000,0<=ai<=MAX_INT.

输出描述

对于每组数据,输出一个整数序列,代表最长递增子序列。

若有多组最长上升子序列,输出第一组。

保证:1<=T<=20,1<=N<=3000,0<=ai<=MAX_INT.

输入样例

2
7
89 256 78 1 46 78 8
5
6 4 8 2 17

输出样例

1 46 78
6 8 17
  • ac代码
#include   
#include   
#include     
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int INF = 0x7fffffff;

const int N = 100005;

int main()
{
    //freopen("in.txt", "r", stdin);

    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n; 
        scanf("%d", &n);
        vector<int> v;
        for (int i = 0; i < n; i++)
        {
            int tmp;
            scanf("%d", &tmp);
            v.push_back(tmp);
        }

        vector<int> dp(n,1); // dp[i] 表示 以v[i]结尾且能构成最长递增序列的长度
        vector<int> pre(n,-1);

        int maxLen = 1;
        int lastpos;

        for (int i = 0; i < n;i++)
        {
            // 对于dp[i], 可以通过 dp[0] 到 dp[i-1] 求解出来
            for (int j = 0; j < i; j++)
            {
                if (v[j] < v[i])
                {
                    if (dp[j] + 1 > dp[i])
                    {
                        dp[i] = dp[j] + 1;
                        pre[i] = j;
                    }
                }

                if (dp[i] > maxLen)
                {
                    maxLen = dp[i];
                    lastpos = i;
                }
            }
        }

        vector<int> ans;
        while (lastpos != -1)
        {
            ans.push_back(v[lastpos]);
            lastpos = pre[lastpos];
        }
        //cout << maxLen << endl;

        for (int i = maxLen - 1; i > 0; i--)
            cout << ans[i] << " ";
        cout << ans[0] << endl;
    }
    return 0;
}

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