hdu 最长递增字序列(java)

用 java 刷的第一个题

这里一片英文 反正题目意思是求最长上升子序列....
有四个样例

Sample Input
4
6 
4 2 6 3 1 5
10 
2 3 4 5 6 7 8 9 10 1
8 
8 7 6 5 4 3 2 1
9 
5 8 9 2 3 1 7 4 6


Sample Output
3
9
1
4

一般求解(此处超时):

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int ncase = in.nextInt();
        while(ncase-- > 0) {
            int n = in.nextInt();
            int[] a = new int[n];
            for(int i = 0; i < n; i++) {
                a[i] = in.nextInt();
            }
            int[] dp = new int[n];
            int ans = 0;
            dp[0] = 1;
            for(int i = 1; i < n; i++) {
                dp[i] = 1;
                for(int j = 0; j < i; j++) {
                    if(a[i] > a[j]) {
                        dp[i] = Math.max(dp[i], dp[j]+1);
                    }
                }
                ans = Math.max(ans, dp[i]);
            }
            System.out.println(ans);
        }
    }
}
反正是超时

法2:
是以前在牛客网上面看的视频 二分

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int ncase = in.nextInt();
        while(ncase-- > 0) {
            int n = in.nextInt();
            int[] a = new int[n];
            for(int i = 0; i < n; i++) {
                a[i] = in.nextInt();
            }
            int[] h = new int[n]; //h 是一个有序的数组     
            // h[i]是指假设当前遍历到 某个数为止   长度为 i+1 的最长递增子序列的  最小末尾 
            h[0] = a[0];

            int ans = 0; // h 数组中最后一个元素的下标 
            for(int i = 1; i < n; i++) {
                //在有序数组中找到第一个大于 a[i]  !!!
                //找到就替换  没找到就扩充 h
                int l = 0, r = ans; 
                while(l <= r) {
                    int m = l + (r-l) / 2;
                    if(h[m] >= a[i]) {
                        r = m - 1;
                    }
                    else l = m + 1;
                }

                ans = Math.max(ans, l);
                h[l] = a[i];
            }
            System.out.println(ans+1);
        }
    }
} 

只是做一个题 学到还挺多的
1、提交时类名必须是Main
2、不能把类所在的那个包给提交进去
3、用二分在数组中找到第一个大于某个数的数的下标
4、一直输到文件尾

Scanner in = new Scanner(System.in);
 while(in.hasNext()){
 }

猜你喜欢

转载自blog.csdn.net/zf2015800505/article/details/81017887