반응형
문제 주소
11054번: 가장 긴 바이토닉 부분 수열
첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)
www.acmicpc.net
알고리즘
DP
힌트
i
위치까지 가장 긴 증가하는 부분수열의 길이와 i
위치까지 가장 긴 감소하는 부분 수열의 길이를 구한다.
문제풀이
dp[i][0]
에 i
위치까지 가장 긴 증가하는 부분수열의 길이 dp[i][1]
에 i
위치까지 가장 긴 감소하는 부분 수열의 길이를 저장하고 두 합이 가장 큰 것의 값을 구한다.
#include<iostream>
using namespace std;
int in[1002];
int dp[1002][2];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>in[i];
}
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
if(in[i]>in[j])
dp[i][0]=max(dp[i][0],dp[j][0]+1);
}
}
for(int i=n;i>=1;i--){
for(int j=n+1;j>i;j--){
if(in[i]>in[j])
dp[i][1]=max(dp[i][1],dp[j][1]+1);
}
}
int ans=0;
for(int i=1;i<=n;i++){
//cout<<i<<" "<<dp[i][0]<<" "<<dp[i][1]<<"\n";
ans=max(ans,dp[i][0]+dp[i][1]);
}
cout<<ans-1;
}
반응형
'Problem Solve > Dynamic Programming' 카테고리의 다른 글
[백준] 9251번 LSC (C) (0) | 2020.04.21 |
---|---|
[백준] 2565번 전깃줄 (C) (0) | 2020.04.12 |
[백준] 11053번 가장 긴 증가하는 부분 수열 (C) (0) | 2020.04.06 |
[백준] 2156번 포도주 시식 (C) (0) | 2020.03.30 |
[백준] 10844번 쉬운 계산 수 (C) (0) | 2020.03.30 |