백준 11066 c++ : DP

magicdrill·2025년 1월 14일
0

백준 문제풀이

목록 보기
528/654

백준 11066 c++ : DP

#include <iostream>
#include <vector>
#include <climits>

using namespace std;

void input_data(vector<int>& C) {
	cout << "\ninput_data()\n";

	int K, i, c;
	
	cin >> K;
	for (i = 0; i < K; i++) {
		cin >> c;
		C.push_back(c);
	}

	return;
}

int find_answer(vector<int>& C) {
	cout << "find_answer()\n";
	
	int answer = 0;
	int i, j, length, K = C.size(), cost, temp;
	vector<vector<int>> DP(K, vector<int>(K, 0));
	vector<int> prefix_sum(K + 1, 0);
	
	cout << "prefix_sum : ";
	for (i = 0; i < K; i++) {
		prefix_sum[i + 1] = C[i] + prefix_sum[i];
		cout << prefix_sum[i + 1] << " ";
	}
	cout << "\n";

	//필요한 임시비용의 합?
	//합쳐진 파일들의 크기
	/*
	C1 C2 C3 C4
	40 30 30 50
	-> ((C1 + C2 = 70) + (C3 + C4 = 80) = 150) = 300이 최소 임시비용의 합
	*/

	for (length = 2; length <= K; length++) {//2개 더하기부터 시작
		for (i = 0; i <= K - length; i++) {
			temp = i + length - 1;//i번째부터 length개 더하기
			DP[i][temp] = INT_MAX;

			for (j = i; j < temp; j++) {
				cost = DP[i][j] + DP[j + 1][temp] + (prefix_sum[temp + 1] - prefix_sum[i]);
				DP[i][temp] = min(DP[i][temp], cost);
			}
		}
	}

	for (i = 0; i < K; i++) {
		for (j = 0; j < K; j++) {
			cout << DP[i][j] << " ";
		}
		cout << "\n";
	}

	answer = DP[0][K - 1];

	return answer;
}

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int T, i;

	cin >> T;
	for (i = 0; i < T; i++) {
		vector<int> C;
		
		input_data(C);
		cout << find_answer(C) << "\n";
	}

	return 0;
}

0개의 댓글