[アルゴリズム概念]最大増分部分数列(LIS)


[アルゴリズム概念]最大増分部分数列(LIS)


Longest Increasing Subsequence
最大増分部分数列
→ある数列が左から右に並んでいる場合、その並び順を維持しながら徐々に大きくなる最長部分数列の問題を抽出する
  • BRUTE-FORCEメソッドは、インクリメント数列→時間複雑度O(2^n)であるか否かを判別するために、列のすべての部分セットを求める
  • DPメソッド要素はa 1,a 2,a 3...an~iの最長部分数列長がLIS(i)である場合、LIS(i)=1+LIS(j)(j
  • 例題
    SWEA最大増分部カウント問題
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Solution {
    
    	public static void main(String[] args) throws IOException{
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		int T = Integer.parseInt(br.readLine());
    		
    		StringTokenizer st = null;
    		int[] arr = null;
    		int[] dp = null;
    		
    		StringBuilder sb = new StringBuilder();
    		for(int tc=1;tc<=T;tc++) {
    			int N = Integer.parseInt(br.readLine());
    			st = new StringTokenizer(br.readLine());
    			arr = new int[N];
    			dp = new int[N];
    			int maxValue = 0;
    			
    			for(int i=0;i<N;i++) {
    				arr[i] = Integer.parseInt(st.nextToken());
    			}
    			
    			for(int i=0;i<N;i++) {
    				dp[i] = 1;
    				for(int j=0;j<i;j++) {
    					if(arr[i] > arr[j] && dp[j] + 1 > dp[i]) {
    						dp[i] = dp[j] + 1;
    					}
    				}
    				if(maxValue < dp[i]) maxValue = dp[i];
    			}
    			
    			sb.append("#"+tc+" "+maxValue+"\n");
    			
    		}
    		
    		System.out.println(sb);
    	}
    }