티스토리 뷰
문제 링크 : https://www.acmicpc.net/problem/11054
11054번: 가장 긴 바이토닉 부분 수열
첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)
www.acmicpc.net
가장 긴 단봉(unimodal) 수열, 즉 증가하다가 감소하는 수열의 길이를 구해야 한다. (증가수열, 감소수열은 허용된다.)
arr 의 index 는 1 부터 N 까지.
최대 부분 감소 수열을 구할 수 있으면 충분하다.
원소가 하나인 수열을 생각하면, dp 의 초기값은 모두 1 이다.
dp[0][i] = ( i 에서 끝나는 최대 부분 증가 수열의 길이 )
dp[1][i] = ( i 에서 시작되는 최대 부분 감소 수열의 길이 )
loop 하나에 몰아 넣어서 처리했다.
전체 코드는 다음과 같다.
#include<bits/stdc++.h>
using namespace std;
int N, arr[1001], dp[2][1001];
int main(){
scanf("%d", &N);
for(int i=1;i<=N;i++) scanf("%d",&arr[i]);
for(int k=0;k<2;k++) for(int i=1;i<=N;i++) dp[k][i]=1;
for(int i=1;i<N;i++) {
for(int j=i+1;j<=N;j++){
if(arr[i]<arr[j])
dp[0][j]=max(dp[0][j], dp[0][i]+1);
if(arr[N+1-i]<arr[N+1-j])
dp[1][N+1-j]=max(dp[1][N+1-j], dp[1][N+1-i]+1);
}
}
int ans=0;
for(int i=1;i<=N;i++) ans=max(ans, dp[0][i]+dp[1][i]);
printf("%d\n",ans-1);
}
반응형
'DS\Algo > Dynamic Programming' 카테고리의 다른 글
BOJ 11066 Merging Files(파일 합치기) (0) | 2022.09.14 |
---|---|
BOJ 11048 이동하기 (0) | 2022.09.11 |
BOJ 11052 카드 구매하기 (0) | 2022.09.09 |
BOJ 13448 SW 역량 테스트 (0) | 2022.08.21 |
BOJ 14165 Team Building (0) | 2022.08.20 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- bash script
- lazy propagation
- dynamic programming
- Vim
- math font
- persistent segment tree
- 세그먼트 트리
- 백준
- Dijkstra
- Reference
- python3
- shell
- stack
- script
- nearest common ancestor
- C++ big number
- number theory
- Shell Programming
- bash
- fenwick tree
- BOJ
- map
- 다익스트라
- javascript array
- Aho-Corasick
- RUBY
- segment tree
- JavaScript
- max flow
- 정수론
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
글 보관함