完美世界2016实习生笔试 [编程题] 最长递增子序列A(C++)

来源:https://www.nowcoder.com/test/1669710/summary

题目:

给定一个长度为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.



输出描述:
 
  

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


输入例子:
2
7
89 256 78 1 46 78 8
5
6 4 8 2 17

输出例子:
3
3

思路:动态规划

用一个数组result[]来存储子问题结果,数组中每个数值result[i]对应子序列[0~i]的最长上升子序列长度。自底向上,从result[0]开始动态更新到result[n-1],result[i]的值应为result[0]~result[j]中满足nums[i]>nums[j](j=0~i-1)条件的最大值+1,维护maxLen即为所求。


题解:

#include "iostream"
#include "vector"
using namespace std;
int main()
{
    int repeatT;
    cin>>repeatT;
    while(repeatT--) {
        //输入数据
        int N;
        cin >> N;
        vector nums;
        for (int i = 0; i < N; i++) {
            int numIn;
            cin >> numIn;
            nums.push_back(numIn);
        }

        int result[3001] = {1};//result[i]表示序列0-i上的最长序列长度

        int maxLen = 1;//维护输出结果maxLen
        for (int i = 1; i < N; i++) {
            if (result[i] == 0)   //初始化result数组
                result[i] = 1;
            //更新
            for (int j = 0; j < i; j++)  //从前向后扫描以[i-1]为尾部的数组,动态更新result[j](j从0到i-1)值
            {
                if (nums[i] > nums[j]) {
                    if ((result[j] + 1) > result[i])
                        result[i] = result[j] + 1;
                    if (result[j] + 1 > maxLen)
                        maxLen = result[j + 1];
                }
            }
//        for(int j=0;j








你可能感兴趣的:(笔试面试)