zoukankan      html  css  js  c++  java
  • 最长递增子序列

    原创


    问题描述:

    求出数组arr的最长递增子序列长度;

    比如:arr={5,64,8,1,55,99,101};的最长递增子序列长度为5

    解题思路:

    此题属于动态分配类的题目,求解当前问题,可以先求解它的子问题,子问题不断堆叠最终求得答案。

    我们先抽象出动态规划数组dp,dp[i]代表数组截止到arr[i]这个元素时能找到的最长递增子序列。

    要求dp[i],我们只需要把这个“尾巴”接到前面它能接上去的元素尾部就行了,但是我们从“前面”

    所有尾部中选出dp值最大的接上去,这样才能保证dp[i]表示这个位置的最长递增子序列。

    比如,上面序列的99,可以接到5,64,8,1,55后面,但是只有接到55后面,dp[5](下标从0开始)

    才能表示最大递增子序列长度。所以,我们需要从前面的所有dp值中选出最大的,假设为dp[j],

    如果满足arr[i]>arr[j],接上去。但是如果arr[i]是arr[0]~arr[i]中的最小元素,dp[i]的值只能是1了。

    代码:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 
     4 int main()
     5 {
     6     int n;
     7     scanf("%d",&n);
     8     int i;
     9     int *arr;
    10     arr=(int *)malloc(sizeof(int)*n);
    11     int *dp=(int *)malloc(sizeof(int)*n);    //动态规划表 
    12     for(i=0;i<=n-1;i++)
    13         scanf("%d",&arr[i]);
    14     
    15     dp[0]=1;    
    16     int j;
    17     for(i=0;i<=n-1;i++)
    18     { 
    19         int max=0; 
    20         for(j=0;j<=i-1;j++)
    21         {
    22             if(arr[i]>arr[j] && dp[j]>max)
    23                 max=dp[j];
    24             dp[i]=max+1;
    25         }
    26     } 
    27     
    28     int max;
    29     max=dp[0];
    30     for(i=1;i<=n-1;i++)
    31         if(dp[i]>max)
    32             max=dp[i];
    33     printf("%d",max);
    34     return 0;
    35 } 
    View Code

    2018-03-20

  • 相关阅读:
    关于bootstrap的css样式总结
    SpringCloudConfig分布式配置中心
    static 关键字的作用-------王志亭
    java 学习当中我遇到的第一个设计模式-----王志亭
    在java 多态 中 父类作为参数列表的方法
    强悍的蒙古人---王志亭
    蒙古人--巴特尔
    乌兰巴托----王志亭
    不一样的插入方法-------王志亭
    乌兰巴托的思念--------------王志亭
  • 原文地址:https://www.cnblogs.com/chiweiming/p/8606917.html
Copyright © 2011-2022 走看看