解题思路: 不想从前往后扫描,想从后往前扫描,抢救不回来了。

注意事项:

参考代码:

/**
 * @author fzy
 * @create 2021/10/11 9:56
 **/
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] arr=new int[1000];
        int length=0;
        while (sc.hasNext()) {
            arr[length]=sc.nextInt();
            length++;
        }
        // arr=new int[]{30,20,10,40,50,60,70,8,7,5,4,9,3,2};
        // length=14;
        System.out.println(lengthOfLDS(arr,length));
        System.out.println(lengthOfLIS(arr,length));

    }

    //最长不上升子序列
    public static int lengthOfLDS(int[] arr,int length){
        int[] dp=new int[length];
        dp[0]=1;
        int res=1;//最长长度
        int resIndex=0;//最长不上升子序列的最后一个字符的索引
        for(int i=1;i<length;i++){
            int index=-1;
            dp[i]=1;
            /当前元素小于或等于 最长序列的最后一个字符 直接算入最长序列
            int j=i-1;
            if(arr[resIndex] >= arr[i]){
                dp[i]=dp[resIndex]+1;
            }else {
                while(j>=0){
                 if(arr[j]>=arr[i]){
                   index=j;
                       dp[i]=dp[index]+1;
                         break;
                    }
                    j--;
                }
              }
              res=Math.max(dp[i],res);
              resIndex=Math.max(j+1,resIndex);
                
        }
        return res;
    }
    //最长上升子序列
    public static int lengthOfLIS(int[] arr,int length){
        int[] dp=new int[length];
        dp[0]=1;
        int res=0;
        int resIndex=0;
        for(int i=1;i<length;i++){
            int index=-1;
            dp[i]=1;
            int j=i-1;
            
            if(arr[resIndex] < arr[i]){
                dp[i]=dp[resIndex]+1;
            }else {
                while(j>=0){
                   if(arr[j]<arr[i]){
                                            index=j;
                                            dp[i]=dp[index]+1;
                                            break;
                                        }
                    j--;
                }
              
              }
            res= Math.max(dp[i], res);
            resIndex=Math.max(j+1, resIndex);

        }
        return res;
    }

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论