25-여름 SISS/C
[SISS/C언어 스터디] 25-여름학기 3주차 스터디 - 동적 계획법
noname64
2025. 7. 12. 15:30
2학년 : Silver 5 이상, 3~4학년 : Silver 3 이상
자율 2문제를 풀어서 제출하면 됩니다.
10844
- 동적 계획법
#include <stdio.h>
#define MOD 1000000000
long long d[101][10]; // d[i][j]: i자리 수에서 마지막 자리가 j일 때의 경우의 수
int main() {
int N;
scanf("%d", &N);
// 초기화: 한 자리 수는 1~9만 가능 (0은 제외)
for (int i = 1; i <= 9; i++)
d[1][i] = 1;
// DP
for (int i = 2; i <= N; i++) {
for (int j = 0; j <= 9; j++) {
switch (j) {
case 0:
// 끝자리가 0이면 이전 자리는 1만
d[i][j] = d[i - 1][1] % MOD;
break;
case 9:
// 끝자리가 9면 이전 자리는 8만
d[i][j] = d[i - 1][8] % MOD;
break;
default:
// 그 외에는 j-1, j+1
d[i][j] = (d[i - 1][j - 1] + d[i - 1][j + 1]) % MOD;
break;
}
}
}
// N자리 수 중 끝자리가 0~9인 경우의 수 합
long long answer = 0;
for (int i = 0; i <= 9; i++)
answer = (answer + d[N][i]) % MOD;
printf("%lld\n", answer);
return 0;
}
2156
- 동적 계획법
#include <stdio.h>
#define MAX 10010
int arr[MAX], d[MAX]; // arr[i]: i번째 포도주 양, d[i]: i번째까지 마셨을 때 최대 양
// 세 수 중 최대값을 반환
int max3(int a, int b, int c) {
if (a > b && a > c) return a;
if (b > c) return b;
return c;
}
int main() {
int n;
scanf("%d", &n);
// 포도주 양
for (int i = 1; i <= n; i++) {
scanf("%d", &arr[i]);
}
// 초기값
d[1] = arr[1];
if (n >= 2) d[2] = arr[1] + arr[2];
// (점화식) DP
for (int i = 3; i <= n; i++) {
d[i] = max3(
d[i - 3] + arr[i - 1] + arr[i], // i와 i-1을 마심 (i-2는 마시지 않음)
d[i - 2] + arr[i], // i만 마심
d[i - 1] // i는 마시지 않음
);
}
printf("%d\n", d[n]); // 최대 포도주 양
return 0;
}