거의 알고리즘 일기장

백준 11055, 1149 본문

알고리즘 문제풀이

백준 11055, 1149

건우권 2020. 5. 10. 19:22

https://www.acmicpc.net/problem/11055

 

11055번: 가장 큰 증가 부분 수열

수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수�

www.acmicpc.net

풀이방법

일반적인 top down 메모제이션 풀이로 풀면 됨.


전체코드

#include <iostream>
#include <algorithm>

using namespace std;
int A[1001];
int dp[1001];
int N;

void dpInit()
{
	for (int i = 0; i <= N; i++)
		dp[i] = -1;
}

void Input()
{
	cin >> N;
	for (int i = 1; i <= N; i++)
		cin >> A[i];
}

int getMaxSum(int pos)
{
	int& ret = dp[pos];
	if (ret != -1) return ret;

	ret = A[pos];
	for (int next = pos + 1; next <= N; next++)
		if (A[pos] < A[next])
			ret = max(ret, getMaxSum(next) + A[pos]);
	
	return ret;
}

int main()
{
	Input();
	dpInit();
	cout << getMaxSum(0);
	return 0;
}

https://www.acmicpc.net/problem/1149

 

1149번: RGB거리

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나

www.acmicpc.net

풀이방법

조건중 i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다. 

이 부분만 유의하면 그냥 탑다운 풀이임.


전체코드

#include <iostream>
#include <algorithm>

#define INF 987654321

using namespace std;
int colors[3][1001];
int dp[3][1001];
int N;

void dpInit()
{
	for (int i = 0; i < 3; i++)
		for (int j = 0; j <= N; j++)
			dp[i][j] = -1;
}

void Input()
{
	cin >> N;
	for (int pos = 1; pos <= N; pos++)
		for (int color = 0; color < 3; color++)
			cin >> colors[color][pos];
}

int getMinValue(int color, int pos)
{
	int& ret = dp[color][pos];
	if (ret != -1) return ret;

	//기저사례 ㅎㅎ
	if (pos == N)
		return ret = colors[color][pos];

	ret = INF;
	for (int nColor = 0; nColor < 3; nColor++)
	{
		//색이 같으면 안된다.
		if (nColor == color && pos!=0)
			continue;
		ret = min(ret, getMinValue(nColor, pos + 1)+ colors[color][pos]);
	}
	return ret;
}

int main()
{
	Input();
	dpInit();
	cout << getMinValue(0, 0);
	return 0;
}

후기

반응형
Comments