백준/동적계획법

[백준] C++ 11055(가장 큰 증가하는 부분 수열)

2zreal 2024. 7. 11. 14:12

#include <iostream>

using namespace std;

int arr[1001];
int DP[1001];

int main(void)
{
	int A=0;
	
	cin>>A;
	
	for(int i=0; i<A; i++)
	{
		cin>>arr[i];
		DP[i]=arr[i];
	}
	
	int max=DP[0];
	
	for(int i=0; i<A; i++)
	{
		for(int j=0; j<i; j++)
		{
			if(arr[i]>arr[j]&&DP[i]<DP[j]+arr[i])
			{
				DP[i]=DP[j]+arr[i];
			}
			if(DP[i]>max)
			{
				max=DP[i];
			}
		}
	}
	
	cout<<max;
}

 

DP 배열에 지금까지 가능한 합을 저장한다.

만약 arr[i]가 arr[j]보다 크다면  DP[i]와DP[j]+arr[i]를 비교한 후 DP[j]+arr[i]가 더 크다면 DP[i]값을 갱신.

 

max의 초기값은 DP[0]임에 주의하자.(왜?? for문 안에서 DP[0]에 대해 검사 안 함.)