반응형
풀이
입력된 수열들을 arr []에 저장한다.
다이내믹 프로그래밍으로 dp [n]에 n번째 원소를 마지막으로 취할 때의 길이를 저장한다.
그리고 dp 배열에서 최댓값을 찾으면 된다.
그러면 dp[n]은 어떻게 찾을 수 있을까?
입력을 받을때마다, 이전 배열값들을 탐색한다.
n> m일 때, arr [m]<arr [n]을 만족하는 dp [m]중 가장 큰 값에 1을 더한다.
해답 코드
#include <iostream>
#include <string>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
int main(){
fastio;
int n,max=1,beforemax;
cin>>n;
int arr[n];
int dp[n];
cin>>arr[0];
dp[0]=1;
for(int i=1; i<n; i++){
cin>>arr[i];
beforemax=0;
for(int j=0; j<i; j++){
if(arr[j]<arr[i] && beforemax<dp[j]){
beforemax=dp[j];
//이전배열을 탐색중인 상태에서 현재의 최댓값 저장
}
}
dp[i]=beforemax+1;
if(dp[i]>max){
max=dp[i];
}
}
cout<<max;
return 0;
}
해맸던 부분
예전에 틀렸던 기록을 보니, 태초에 beforemax를 0이 아닌 1로 저장해서 틀렸다.
이렇게 하면 모든 값이 동일한 수열 가령 10 10 10 같은 수열에서 오답을 내놓는다.
반응형
'algorithm > dp' 카테고리의 다른 글
[백준] 1932번: 정수 삼각형 풀이 및 해설(C++) (1) | 2023.06.11 |
---|---|
[백준] 1149번: RGB거리 풀이 및 해설(C++) (1) | 2023.06.11 |
[백준] 9184번: 신나는 함수 실행 풀이 및 해설(C++) (0) | 2023.06.11 |
[백준] 11051번: 이항 계수 2 풀이 및 해설(C++) (0) | 2023.06.10 |
[백준] 1912번: 연속합 풀이 및 해설(C++) (0) | 2023.06.10 |