728x90
PI
https://www.algospot.com/judge/problem/read/PI
<코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | #include <stdio.h> int a[10100]; int three(int num) { int nando = 10; if (a[num - 2] == a[num - 1] && a[num - 1] == a[num]) nando = 1; else if (a[num - 2] + 2 == a[num - 1] + 1 && a[num - 1] + 1 == a[num]) nando = 2; else if (a[num - 2] == a[num - 1] + 1 && a[num - 1] + 1 == a[num] + 2) nando = 2; else if (a[num - 2] == a[num]) nando = 4; else if (a[num - 2] - a[num - 1] == a[num - 1] - a[num]) nando = 5; return nando; } int four(int num) { int nando = 10; if (a[num - 3] == a[num - 2] && a[num - 2] == a[num - 1] && a[num - 1] == a[num]) nando = 1; else if (a[num - 3] + 3 == a[num - 2] + 2 && a[num - 2] + 2 == a[num - 1] + 1 && a[num - 1] + 1 == a[num]) nando = 2; else if (a[num - 3] == a[num - 2] + 1 && a[num - 2] + 1 == a[num - 1] + 2 && a[num - 1] + 2 == a[num] + 3) nando = 2; else if (a[num - 2] == a[num] && a[num - 3]==a[num-1]) nando = 4; else if (a[num - 3] - a[num - 2] == a[num - 2] - a[num - 1] && a[num - 2] - a[num - 1] == a[num - 1] - a[num]) nando = 5; return nando; } int five(int num) { int nando = 10; if (a[num - 4] == a[num - 3] && a[num - 3] == a[num - 2] && a[num - 2] == a[num - 1] && a[num - 1] == a[num]) nando = 1; else if (a[num - 4] + 3 == a[num - 3] + 2 && a[num - 3] + 3 == a[num - 2] + 2 && a[num - 2] + 2 == a[num - 1] + 1 && a[num - 1] + 1 == a[num]) nando = 2; else if (a[num - 4] == a[num - 3] + 1 && a[num - 3] == a[num - 2] + 1 && a[num - 2] + 1 == a[num - 1] + 2 && a[num - 1] + 2 == a[num] + 3) nando = 2; else if (a[num - 4] == a[num] && a[num - 2] == a[num] && a[num - 3] == a[num - 1]) nando = 4; else if (a[num - 4] - a[num - 3] == a[num - 3] - a[num - 2] && a[num - 3] - a[num - 2] == a[num - 2] - a[num - 1] && a[num - 2] - a[num - 1] == a[num - 1] - a[num]) nando = 5; return nando; } int main(void){ int testcase; char c[10100]; scanf("%d", &testcase); while(testcase--){ int dp[10100]; int size = 0; scanf("%s", c); for (int i = 0; i < 10100; i++){ if (c[i] == 0) { size = i; break; } a[i] = c[i] - '0'; } dp[0] = dp[1] = 1000000; dp[2] = three(2); dp[3] = four(3); dp[4] = five(4); dp[5] = dp[2] + three(5); dp[6] = dp[2] + four(6) < dp[3] + three(6) ? dp[2] + four(6) : dp[3] + three(6); for (int i = 7; i < size; i++){ int on, tw, th; int temp_result; on = dp[i - 3] + three(i); tw = dp[i - 4] + four(i); th = dp[i - 5] + five(i); temp_result = on < tw ? on : tw; temp_result = temp_result < th ? temp_result : th; dp[i] = temp_result; } printf("%d\n", dp[size - 1]); } } | cs |
<문제 푼 요령>
1. 이 문제는 DP 문제이다.
2. 여기서 중요한것은 역시나 점화식이다.
3. three 는 3개의 경우를 따져서 난이도를 출력하는 함수 four는 4개의 경우를 따져서 난이도를 출력하는 함수 five는 5개의 경우를 따져서 난이도를 출력하는 함수이다.
4. 그래서 이 함수들을 이용해서 1차원 dp 테이블을 만들어서 구한다. 설명이 부족해서 그림으로 대체하겠다.
위의 그림처럼 끊임없이 앞에있는 값을 이용해서 현재의 최소값을 비교해서 구해주는 것이다.
728x90
'Algorithm > DP(동적 계획법)' 카테고리의 다른 글
[백준][2294번][DP] 동전 2 (2) | 2016.04.09 |
---|---|
[백준][2293번][DP] 동전 1 (1) | 2016.04.09 |
[백준][1073번][DP] 도미노 (0) | 2016.03.30 |
[백준][2092번][DP] 집합의 개수 (0) | 2016.03.30 |
[백준][2169번][DP] 로봇 조종하기 (1) | 2016.03.23 |
댓글