[코딩테스트][Dynamic Programming] 백준 1463, 11726, 11727


백준 1463, 11726, 11727

여담

동적계획(Dynamic Programming) 을 고안한 Richard E.Bellman은 dynamic이란 단어가 멋있어서 선택했다고 한다….

https://github.com/h-dyeon/Algorithm

백준 1463 1로만들기

//내코드
#include<iostream>
using namespace std;
int x;//(1<=X<=1000000)
int answer[1000002];
int main() {
	scanf_s("%d", &x);

	answer[1] = 0;
	answer[2] = 1;
	answer[3] = 1;
	for (int i=4; i <= x; i++) {
		answer[i] = answer[i - 1] + 1;
		if (i % 2 == 0 && answer[i / 2] + 1 < answer[i])
			answer[i] = answer[i / 2] + 1;
		if (i % 3 == 0 && answer[i / 3] + 1 < answer[i])
			answer[i] = answer[i / 3] + 1;
	}

	cout << answer[x];
	return 0;
}

//참고 코드 ==> https://www.acmicpc.net/source/16250222
//재귀함수 사용, 
#include <cstdio>
using namespace std;
int i;
int solve(int num) {
	if (num < 2) return 0;
	int a1 = solve(num / 3) + num % 3 + 1;
	int a2 = solve(num / 2) + num % 2 + 1;

	return a1 < a2 ? a1 : a2;
}
int main() {
	int num;
	scanf("%d", &num);
	printf("%d", solve(num));
}

백준 11726 2xn타일링

이번엔 재귀함수로 해볼까 하다가 시간초과가 떴다. 그래서 값을 저장해두는 방식으로 바꿨다.

#include <iostream>
using namespace std;
int x;//(1<=X<=1000)
int t[1001];

int answer(int tmp) {
	if (t[tmp] != 0)
		return t[tmp];
	else
		t[tmp]= (answer(tmp - 1) + answer(tmp - 2))%10007;
	return t[tmp];
}
int main() {
	scanf_s("%d", &x);
	t[1] = 1;
	t[2] = 2;
	cout << answer(x) % 10007;
	return 0;
}
//참고코드 https://www.acmicpc.net/source/2737958
#include<stdio.h>
int main()
{
	int n,dp[1001]={0,1,2};
	scanf("%d",&n);
	for(int i=3;i<=n;++i)
		dp[i]=(dp[i-1]+dp[i-2])%10007;
	printf("%d",dp[n]);
}

백준 11727 2xn타일링2

타일링1번에서 규칙을 살짝만 바꾸면됨!

#include <iostream>
using namespace std;
int x;//(1<=X<=1000)
int t[1001];

int main() {
	scanf_s("%d", &x);
	int t[1001] = {0, 1,3,5 };
	for (int i = 4; i <= x; i++) {
		t[i] =( t[i - 1] + t[i - 2] * 2)%10007;
	}
	cout << t[x];
	return 0;
}





© 2019.04. by h-dyeon

Powered by theorydb