본문 바로가기
개발 관련 공부/알고리즘

백준 11054

by 슴새 2021. 7. 22.
반응형

import java.util.Scanner;
 
public class Main{
    static public void main(String args[]){
    	Scanner sc = new Scanner(System.in);
    	int n = sc.nextInt();
        //가장 긴 증가하는 수열 
        int arr []=new int [n];
        for(int i=0;i<n;i++)
            arr[i]=sc.nextInt();
        int dp []= new int [n];
        int ans=1;
        for(int i=0;i<n;i++){
            int left=0; //왼쪽 최대길이
            int right=0; //오른쪽 최대길이 
            dp[i]=1;
            int dp1 []=new int [n]; //왼쪽용 dp
            int dp2 []=new int [n]; //오른쪽용 dp
            //왼쪽
            for(int a=0;a<i;a++){
                dp1[a]=1;
                for(int b=0;b<a;b++){
                	if(arr[a]<arr[i]) {
                		 if(arr[a]>arr[b])
                             dp1[a] = Math.max(dp1[a], dp1[b]+1);
                         left=Math.max(left,dp1[a]);
                	}
                    
                }
            }
            //오른쪽
            for(int a=i;a<n;a++){
                dp2[a]=1;
                for(int b=i;b<a;b++){
                	if(arr[a]<arr[i]) { //중심arr[i]보다 크면 안됨 
                		if(arr[a]<arr[b])
                            dp2[a] = Math.max(dp2[a], dp2[b]+1);
                        right=Math.max(right,dp2[a]);
                	}
                     
                }
            }
            dp[i]=dp[i]+right+left-1;
            ans=Math.max(dp[i],ans);
        }
         System.out.println(ans);
        
        
	}
     
 }

가장 긴 증가하는 부분 수열(왼쪽)+ 가장 긴 감소하는 부분 수열(오른쪽)-1

단, 중심이 되는 arr[i] 가 가장 크도록 체크하는 부분이 있어야 함

 

반응형

'개발 관련 공부 > 알고리즘' 카테고리의 다른 글

백준 2751  (0) 2021.07.28
백준 1912  (0) 2021.07.26
백준 11053  (0) 2021.07.21
백준 11057  (0) 2021.07.20
백준 11726번  (0) 2021.07.19

댓글