[코딩테스트][Dynamic Programming] 백준 9095, 10844, 11057, 2193


백준 9095, 10844, 11057, 2193

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

백준 9095 : Adding 1s, 2s, and 3s

#include <iostream>
using namespace std;
int answer[12];
int main() {
	int T;
	scanf_s("%d", &T);
	answer[1] = 1;
	answer[2] = 2;
	answer[3] = 4;
	while (T--) {
		int n;
		scanf_s("%d", &n);
		for (int i = 4; i <= n; i++) {
			answer[i] =  answer[i - 1]+ answer[i - 2]+  answer[i - 3];
		}
		cout << answer[n] << "\n";
	}
	return 0;
}

백준 10844 : 쉬운 계단 수

추측을 하지 말고 손으로 변화과정을 그려볼것!

#include <iostream>
using namespace std;
#include <algorithm>

int main() {
	long long answer[101][10] = { {},{0,1,1,1,1,1,1,1,1,1} };
	long long modd = 1000000000;
	int n;
	scanf_s("%d", &n);

	for (int i = 2; i <= n; i++) {
		for (int j = 0; j < 10; j++) {
			if (j == 0) {
				answer[i][j] = answer[i - 1][j+1] % modd;
			}				
			else if (j == 9) {
				answer[i][j] = answer[i - 1][j-1] % modd;
			}
			else {
				answer[i][j] = (answer[i - 1][j-1]+ answer[i - 1][j+1])%modd;
			}
		}
	}

	long long sum = 0;
	for (int i = 0; i < 10; i++) {
		sum = (sum + answer[n][i]) % modd;
	}
	cout << sum << "\n";
	
	return 0;
}



//https://www.acmicpc.net/source/4408282
//필요없는 부분은 굳이 저장을 하지 않아도 됨
#include <cstdio>
#define R 1000000000
int n,s,k=1,d[2][11];
int main() {
	int i,j;
	for(j=1; j<=9; j++) d[k][j] = 1;
	scanf("%d", &n);
	for(i=2; i<=n; i++) {
		k = !k;
		for(j=0; j<10; j++) d[k][j] = (d[!k][j-1] + d[!k][j+1]) % R;
	}
	for(j=0; j<10; j++) s = (s+d[k][j]) % R;
	printf("%d", s);
	return 0;
}

백준 11057 : 오르막수

#include <iostream>
using namespace std;
#include <algorithm>

int main() {
	long long answer[2][10] = { { 1, 1,1,1,1,1,1,1,1,1},{0,} };
	long long modd = 10007;

	int n, b = 0;
	scanf_s("%d", &n);
	for (int k = 1; k < n; k++) { //횟수
		b = !b;
		for (int i = 0; i < 10; i++) { //끝자리수가 0부터 9까지
			answer[b][i] = 0;
			for (int j = 0; j <= i; j++) {
				answer[b][i] = (answer[b][i] + answer[!b][j]) % modd;
			}
		}
	}

	long long sum = 0;
	for (int i = 0; i < 10; i++) {
		sum = (sum + answer[b][i]) % modd;
	}
	cout << sum;

	return 0;
}


//https://www.acmicpc.net/source/4408448
#include <cstdio>
int n,d[15]={1};
int main() {
	int i,j;
	scanf("%d", &n);
	for(i=0; i<=n; i++)
		for(j=1; j<10; j++) 
            d[j]+=d[j-1], d[j]%=10007;
	printf("%d", d[9]);
	return 0;
}

백준 2193 : 이친수

입력값 범위를 반드시 고려해서 자료형을 고를것!

#include <iostream>
using namespace std;

int main() {
	long long answer[2] = { 0,1 };
	int n = 0;
	scanf_s("%d", &n);

	for (int i = 1; i < n; i++) {
		long long ans = answer[1];
		answer[1] = answer[0];
		answer[0] = answer[0] + ans;
	}

	cout << answer[0] + answer[1];
	return 0;
}

// https://www.acmicpc.net/source/16165942
// 규칙을 알고 피보나치수로 간단하게 줄임
#include <stdio.h>
int main(){
	long long  a[91], n;
	scanf("%lld",&n);
	a[1]=1;
	a[2]=1;
	for(int i=3;i<=n;i++) a[i]=a[i-1]+a[i-2];
	printf("%lld", a[n]);
} 





© 2019.04. by h-dyeon

Powered by theorydb