首页 > 试题广场 >

最长上升子序列(一)

[编程题]最长上升子序列(一)
  • 热度指数:62051 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 n 的数组 arr,求它的最长严格上升子序列的长度。
所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组。例如 [1,5,3,7,3] 数组,其子序列有:[1,3,3]、[7] 等。但 [1,6]、[1,3,5] 则不是它的子序列。
我们定义一个序列是 严格上升 的,当且仅当该序列不存在两个下标 ij 满足
数据范围:
要求:时间复杂度 O(nlogn), 空间复杂度 O(n)
示例1

输入

[6,3,1,5,2,3,7]

输出

4

说明

该数组最长上升子序列为 [1,2,3,7] ,长度为4
#define max(a,b) (a>b?a:b)
int LIS(int* arr, int arrLen ) {
    int dp[1000]={1}, res=1, i, j;
    if(arrLen==0)
        return 0;
    for(i=0; i<sizeof(dp)/sizeof(int); i++)
        dp[i] = 1;
    for(i=1; i<arrLen; i++) {
        for(j=0; j<i; j++) {
            if(arr[i]>arr[j]) {
                dp[i] = max(dp[i], dp[j]+1);
                res = max(res, dp[i]);
            }
        }
    }
    return res;    
}

编辑于 2024-03-24 19:06:41 回复(0)
/*  dp[i] 表示截止第i个数的最大长度 ,第i个数必须取
 dp[i] = dp[j] + 1; arr[j] < arr[i](写出该状态方程比较重要)*/

int LIS(int* arr, int arrLen ) {
    if(arrLen == 0 || arrLen == 1)
    {
        return arrLen;
    }
    int max =1;
    int dp[arrLen];
    for(int i = 0 ;i < arrLen; i++)/*至少有一个是数*/
    {
        dp[i] = 1;
    }

    for(int i = 1; i < arrLen ;i++)
    {
        for(int j = 0; j < i; j++)
        {
            if((arr[j] < arr[i]) && (dp[j] +1 > dp[i]))
            {
                dp[i] = dp[j] +1;
               
            }
        }
        if(dp[i] > max)
        {
            max = dp[i];
        }
    }
    return max;

}
发表于 2023-04-02 10:25:14 回复(0)

问题信息

难度:
2条回答 2365浏览

热门推荐

通过挑战的用户

查看代码