[算法]动态规划之最长递增子序列

最长递增子序列

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

#define N 4

int solve(int *array, int n) {
    int *dp = (int *)malloc(n * sizeof(int));
    int i;
    int j;
    int result;
    bzero((void *)dp, n * sizeof(int));

    dp[0] = 1;
    for(i = 1; i < n; i++) {
        *(dp + i) = *(dp + i - 1);
        for(j = 0; j < i; j ++) {
            if(*(array + i) > *(array + j)) {
                *(dp + i) = (*(dp + i) < *(dp + j) + 1) ? (*(dp + j) + 1) : *(dp + i);
            }
        }
    }
    result = *(dp + n -1);
    free(dp);
    return result;
}

int main(char ** args) {
    srand((unsigned)time(NULL));
    int *array = (int *)malloc(N * sizeof(int));
    for(int i = 0; i < N; i++) {
        *(array + i) = rand() % N;
        printf("%d\t", *(array + i));
    }
    int ret = solve(array, N);
    printf("\nresult:%d\n", ret);
    free(array);
    return 0;
}
时间: 2024-10-10 11:00:30

[算法]动态规划之最长递增子序列的相关文章

动态规划之最长递增子序列问题详解

最近重新开始看动态规划,动态规划算法的有效性依赖于问题本身所具有的两个重要性质:最优子结构性质和子问题重叠性质. 1.最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质. 2.重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次.动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解. (二).动态规划算法的基本步骤设计一个标准的动态规划算法,通常

动态规划求解最长递增子序列的长度

一,问题描述 给定一个序列,求解它的最长 递增 子序列 的长度.比如: arr[] = {3,1,4,1,5,9,2,6,5}   的最长递增子序列长度为4.即为:1,4,5,9 二,算法分析 有两种方式来求解,一种是转化为LCS问题.即,首先对数组排序,将排序后的结果存储在辅助数组中.排序时间复杂度O(NlogN),排序后的数组与原数组组成了LCS(N,N)问题.解决LCS问题的时间复杂度为O(N^2),故整个算法的时间复杂度为O(N^2),空间复杂度为O(N) 另一种方式是直接用DP求解,算

算法——动态规划篇——最长公共子序列

问题描述      最长公共子序列,英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列.       解决最长公共子序列,一种常用的办法,就是穷举法,组合出所有的情况,但是这样对于长序列的情况来说,是非常不实际.. 假设现在有两个序列,x[]={'A','B','C','B','D','A','B'};y[]={'B','D','C','A'

算法--字符串:最长递增子序列LIS

转自:labuladong公众号 很多读者反应,就算看了前文 动态规划详解,了解了动态规划的套路,也不会写状态转移方程,没有思路,怎么办?本文就借助「最长递增子序列」来讲一种设计动态规划的通用技巧:数学归纳思想.  最长递增子序列(Longest Increasing Subsequence,简写 LIS)是比较经典的一个问题,比较容易想到的是动态规划解法,时间复杂度 O(N^2),我们借这个问题来由浅入深讲解如何写动态规划. 比较难想到的是利用二分查找,时间复杂度是 O(NlogN),我们通过

算法总结之 最长递增子序列

给定一个数组arr,返回arr最长递增子序列 要求 如果长度为N 请实现时间复杂度为O(N logN)的方法 动态规划解题思路: 1 生成长度为N的数组dp, dp[i]表示在以arr[i]这个数结尾的情况下,arr[0....i]中的最大递增子序列长度 2 对第一个数arr[0]来说,令dp[0]=1,接下来从左到右依次算出每个位置的数结尾情况下,最长递增子序列长度

动态规划之最长递增子序列

题目一:给定一个长度为N的数组,找出一个最长的单调递增子序列(不一定连续,但是顺序不能乱).并返回单调递增子序列的长度. 例如:给定一个长度为8的数组A{1,3,5,2,4,6,7,8},则其最长的单调递增子序列为{1,2,4,6,7,8},我们返回其长度6. 题目二:在题目一的基础上,我们要返回该子序列中的元素.例如,给定一个长度为8的数组A{1,3,5,2,4,6,7,8},我们返回的是单调递增子序列{1,2,4,6,7,8}. 解析:我们使用动态规划的思想来解决此问题,假设给定的数组为nu

动态规划之最长递增子序列(LIS)

       在一个已知的序列{ a1,a2,--am}中,取出若干数组成新的序列{ ai1, ai2,-- aim},其中下标 i1,i2, --im保持递增,即新数列中的各个数之间依旧保持原数列中的先后顺序,那么称{ ai1, ai2,--aim}为原序列的一个子序列.若在子序列中,当下标 ix > iy时,aix > aiy,那么称其为原序列的一个递增子序列.最长递增子序列问题就是在一个给定的原序列中,求得其最长递增子序列的长度.       求最长递增子序列的递推公式为:      

[算法]动态规划之最长公共子序列

最长公共子序列 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #include<string.h> 5 6 #define N 5 7 8 int max(int a, int b, int c) { 9 10 int ab = a>b ? a : b; 11 return ab > c ? ab : c; 12 13 } 14 15 void solve(int *a

最长递增子序列(LIS)求解

问题描述 最长递增子序列也称 "最长上升子序列",简称LIS ( longest increasing subsequence).设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lis=<ak1,ak2,-,akm>,其中k1<k2<-<km且ak1<ak2<-<akm.求最大的m值. 如:求一个一维数组arr[i]中的最长递增子序列的长度,如在序列{ 7, 1, 6, 5, 3, 4, 8