美文网首页
c语言求最长递增(减)子序列

c语言求最长递增(减)子序列

作者: 一路向后 | 来源:发表于2021-05-20 21:52 被阅读0次

1.源码实现

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

typedef short (*cmpfun)(int, int);

short max(int a, int b)
{
    return a > b;
}

short min(int a, int b)
{
    return a < b;
}

/*最长递增(减)子序列*/
int getdp(int *a, int n, cmpfun f, int *dp, int *s)
{
    int **lis = malloc(n*sizeof(int *));
    int cnt;
    int ans = 1;
    int m = 0;
    int d;
    int i, j;

    memset(dp, 0x00, n*sizeof(int));

    lis[0] = malloc(sizeof(int));
    dp[0] = 1;
    lis[0][0] = a[0];

    for(i=1; i<n; i++)
    {
        cnt = 1;

        for(j=0; j<i; j++)
        {
            if(f(a[i], a[j]))
            {
                if(dp[j]+1 > cnt)
                {
                    cnt = dp[j]+1;
                }
            }
        }

        dp[i] = cnt;
    }

    for(i=1; i<n; i++)
    {
        lis[i] = malloc(dp[i]*sizeof(int));

        if(dp[i] > ans)
        {
            m = i;
            ans = dp[i];
        }
    }

    for(i=0; i<n; i++)
    {
        cnt = 1;
        d = -1;

        for(j=0; j<i; j++)
        {
            if(f(a[i], a[j]))
            {
                if(dp[j]+1 > cnt)
                {
                    cnt = dp[j]+1;
                    d = j;
                }
            }
        }

        if(d >= 0)
        {
            for(j=0; j<dp[d]; j++)
            {
                lis[i][j] = lis[d][j];
            }
        }
        else
        {
            j = 0;
        }

        lis[i][j] = a[i];
    }

    for(i=0; i<dp[m]; i++)
    {
        s[i] = lis[m][i];
    }

    for(i=1; i<n; i++)
    {
        free(lis[i]);
        lis[i] = NULL;
    }

    free(lis);
    lis = NULL;

    return ans;
}

int main()
{
    int a[3000];
    int b[3000];
    int c[3000];
    int d[3000];
    int n = 0;
    int s;
    int m[4];
    int i;

    while(scanf("%d", &n) != EOF)
    {
        for(i=0; i<n; i++)
        {
            scanf("%d", a+i);
        }
    
        m[0] = getdp(a, n, max, b, c);
        m[1] = getdp(a, n, min, b, d);

        printf("%d\n", m[0]);

        for(i=0; i<m[0]; i++)
        {
            printf("%d ", c[i]);
        }

        printf("\n");

        printf("%d\n", m[1]);

        for(i=0; i<m[1]; i++)
        {
            printf("%d ", d[i]);
        }
    
        printf("\n");
    }

    return 0;
}

2.编译源码

$ gcc -o example examle.c -std=c89

3.运行及其结果

$ ./example
8
186 186 150 200 160 130 197 200
4
150 160 197 200 
3
186 150 130 

相关文章

  • c语言求最长递增(减)子序列

    1.源码实现 2.编译源码 3.运行及其结果

  • 字符串的几个问题

    1.最长公共子序列2.最长公共子串3.最长回文串4.最长回文序列5.最长递增序列6.最长先增后减序列7.(最短)编...

  • Python算法之旅元组的风暴之最长上升子序列

    元组的风暴之最长上升子序列 小美:还记得我们上次做的那道题目吗?求最长连续递增子序列的长度。 阿福:记得啊,当时我...

  • 最长递增子序列

    问题描述 求最长递增子序列的长度 分析 主要是确定状态,F[i]表示以ai 结束的最长递增子序列长度,F[i]=m...

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

    方法一:最长公共子序列法 将问题转换成求递增排序的数组与原数组的最长公共子序列。不知道如何排序?看这里: 七大排序...

  • 最长递增子序列: 动态规划和LCS(最长公共子序列)

    最长递增子序列: 动态规划和LCS(最长公共子序列)子序列和子串的区别:子序列不连续,字串连续。这个题两种解法 动...

  • Python算法之旅元组的风暴之最长连续递增序列

    元组的风暴之最长连续递增序列 小美:前几天老师布置了一道题目:求最长连续递增子序列的长度。我感觉题目并不难,很快就...

  • 各种最x子序列

    最长上升子序列(LIS)问题:给定长度为n的序列a,从a中抽取出一个子序列,这个子序列需要单调递增。问最长的上升子...

  • 动态规划常见面试题

    子序列类型编辑距离 最长递增子序列 最大子数组 最长公共子序列 背包问题0-1背包问题 子集背包问题 完全背包问题...

  • 06-21:todo

    0、最长连续子序列 最长递增子序列: 核心思路:保持递增,代码如下: 1、二叉树路径和 2、大数加法/大数乘法 3...

网友评论

      本文标题:c语言求最长递增(减)子序列

      本文链接:https://www.haomeiwen.com/subject/ejzbjltx.html