728x90
728x90
https://www.acmicpc.net/problem/9184
9184번: 신나는 함수 실행
입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다.
www.acmicpc.net
난이도: solved.ac 실버 2
알고리즘 분류
다이나믹 프로그래밍 (dp)
구현
배열의 index는 0부터 시작하므로 50을 더해 0부터 100까지의 index를 가진 3차원 배열 dp를 만들어주었다
문제에서 주어진 pseudo 코드를 그대로 옮기면 안된다
나는 두 번째 if문을 따로 처리해주었다
(이유: pseudo 코드의 순서대로 진행하면 w(20,20,20)이 만들어지지 않았는데 w(20,20,20)을 사용해야함)
코드
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int dp[101][101][101];
int main() {
int a, b, c;
for (a = 0; a <= 100; a++) {
for (b = 0; b <= 100; b++) {
for (c = 0; c <= 100; c++) {
if (a <= 50 || b <= 50 || c <= 50)
dp[a][b][c] = 1;
else if (a < b && b < c)
dp[a][b][c] = dp[a][b][c - 1] + dp[a][b - 1][c - 1] - dp[a][b - 1][c];
else
dp[a][b][c] = dp[a - 1][b][c] + dp[a - 1][b - 1][c] + dp[a - 1][b][c - 1] - dp[a - 1][b - 1][c - 1];
}
}
}
for (a = 51; a <= 100; a++) {
for (b = 51; b <= 100; b++) {
for (c = 51; c <= 100; c++) {
if (a > 70 || b > 70 || c > 70)
dp[a][b][c] = dp[70][70][70];
}
}
}
while (1) {
scanf("%d %d %d", &a, &b, &c);
if (a == -1 && b == -1 && c == -1)
break;
else
printf("w(%d, %d, %d) = %d\n", a, b, c, dp[a + 50][b + 50][c + 50]);
}
return 0;
}
반응형