https://www.acmicpc.net/problem/11055
11055번: 가장 큰 증가 부분 수열
수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수�
www.acmicpc.net
은근 까다로운 문제였다. 예전에 못 풀어서 손 놓고 있었는데, 다시 풀어보니 풀리더라.
일단 i까지 가장 큰 증가 부분 수열의 합을 저장하는 ans를 만들고, dp[i] 배열은 i번째 원소를 포함하는 가장 큰 부분 증가 수열이다. 매 원소(A[i])를 입력받으면서 ans와 dp[i]를 비교하면 쉽게 해결된다.
#include <cstdio>
#include <algorithm>
using namespace std;
int main(void){
int N, A[1001]={}, dp[1001]={}, maxi, ans=-1;
scanf("%d",&N);
for(int i=0; i<N; i++){
scanf(" %d",&A[i]);
maxi=-1;
for(int j=0; j<i; j++){
if(A[j]<A[i])
maxi=max(maxi, dp[j]+A[i]);
}
maxi=max(maxi, A[i]);
dp[i]=maxi;
ans=max(ans, dp[i]);
}
printf("%d",ans);
}
'알고리즘 문제' 카테고리의 다른 글
[C/C++ 백준 10844번] 쉬운 계단수 (Silver 1) (0) | 2020.05.11 |
---|---|
[C/C++ 백준 1965번] 상자 넣기 (Silver 2) (0) | 2020.05.11 |
[C/C++ 백준 2294번] 동전2 (Silver 1) (0) | 2020.05.10 |
[C/C++ 백준 1149번] RGB거리 (Silver 1) (0) | 2020.05.09 |
[C/C++ 백준 11052번] 카드구매하기 (Silver 1) (0) | 2020.05.09 |