[BOJ] 11066 : ํ์ผ ํฉ์น๊ธฐ
๋ฌธ์ ๋งํฌ
11066๋ฒ: ํ์ผ ํฉ์น๊ธฐ (acmicpc.net)
11066๋ฒ: ํ์ผ ํฉ์น๊ธฐ
์์ค๊ฐ์ธ ๊น๋์ ์ ์์ค์ ์ฌ๋ฌ ์ฅ(chapter)์ผ๋ก ๋๋์ด ์ฐ๋๋ฐ, ๊ฐ ์ฅ์ ๊ฐ๊ฐ ๋ค๋ฅธ ํ์ผ์ ์ ์ฅํ๊ณค ํ๋ค. ์์ค์ ๋ชจ๋ ์ฅ์ ์ฐ๊ณ ๋์๋ ๊ฐ ์ฅ์ด ์ฐ์ฌ์ง ํ์ผ์ ํฉ์ณ์ ์ต์ข ์ ์ผ๋ก ์์ค์ ์์ฑ๋ณธ
www.acmicpc.net
ํ์ด
๋ชจ๋ ํ์ผ์ ํฉ์น๋ ์ต์ ๋น์ฉ์ ์ถ๋ ฅํ๋ ๋ฌธ์ .
๋์ ๊ณํ๋ฒ(Dynamic programming)์ ํ์ฉํด์ผํ๋ค. ๊ทธ ์ค์์๋ 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํ DP๋ฅผ ํ์ฉํด์ผํ๋ค.
DP[i][j] ๋ฐฐ์ด์ i๋ถํฐ j๋ฒ์งธ ๊น์ง์ ํ์ผ์ ํฉ์น๊ธฐ ์ํด ํ์ํ ์ต์๋น์ฉ์ ์ ์ฅํ๋ค.
์ฆ DP[i][j] = Min(i <= K <= j)DP[i][K] + DP[K+1] + Sum[i to j] (์ด๊ฑด ๊ณ ์ ์ง์ถ)
์์ ๋ฅผ ๋ณด๋ฉด 40 30 30 50 ์ด๋ค DP[i][i] ๋ ๋ชจ๋ 0์ด ์ ์ฅ๋์ด ์๊ณ
DP[1][2] = 70, DP[2][3] = 60, DP[3][4] = 50 ์ด ํ ๋น๋๋ค.
DP[1][3]์๋ DP[1][1] + DP[2][3] , DP[1][2] + DP[3][3] ์ค ์ต์๊ฐ๊ณผ Sum[1 ~ 3]์ ๋ํ ๊ฐ์ด ์ ์ฅ๋์ด์ผํ๋ค.
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
|
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef priority_queue <pair<pair<int, int>, int>, vector<pair<pair<int, int>, int>>, greater<pair<pair<int, int>, int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 500 + 5;
int K;
int T;
int dp[MAX_N][MAX_N];
int File[MAX_N];
ll Sum[MAX_N];
void Init() {
for (int i = 0; i < MAX_N; i++) {
for (int j = 0; j < MAX_N; j++) {
dp[i][j] = 0;
}
}
memset(File, 0, sizeof(File));
memset(Sum, 0, sizeof(Sum));
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> T;
while (T--) {
cin >> K;
Init();
for (int i = 1; i <= K; i++) {
cin >> File[i];
Sum[i] += Sum[i - 1] + File[i];
}
for (int i = 1; i < K; i++) { // ๋ฒ์์ ๊ธธ์ด
for (int j = 1; j <= K - i; j++) { //์์์
int Min = INF;
for (int k = 0; k < i; k++) {
Min = min(Min, dp[j][j + k] + dp[j+k+1][j + i]);
}
dp[j][j + i] = Min + (Sum[j + i] - Sum[j - 1]);
}
}
cout << dp[1][K] << "\n";
}
return 0;
}
|
cs |
๊ตฌํ๋ง ์ ํด์ค๋ค๋ฉด AC๋ฅผ ๋ฐ์ ์ ์๋ค.