본문 바로가기
백준 문제 풀이 & C++ 공부

백준 11066 C++

by daisy0461 2025. 3. 26.
#include <bits/stdc++.h>

using namespace std;

int testCase;
int n;
int arr[510];
int sum[510];
int dp[510][510];

int main() 
{
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	cin >> testCase;

	while (testCase--) {
		cin >> n;
		for (int i = 1; i <= n; i++) {
			cin >> arr[i];
			//dp[i][i] = arr[i];
			sum[i] = sum[i - 1] + arr[i];		//누적합
		}

		for (int len = 1; len < n; len++) {
			for (int start = 1; start + len <= n; start++) {
				int end = start + len;
				dp[start][end] = INT_MAX;

				for (int mid = start; mid <= end; mid++) {
					int cost = dp[start][mid] + dp[mid + 1][end] + (sum[end] - sum[start-1]);
					dp[start][end] = min(dp[start][end], cost);
					
				}
				//cout << "start : " << start << "  end : " << end << "  " << dp[start][end] << "\n";
			}
		}
		cout << dp[1][n] << "\n";
	 }
}

처음엔 (dp[start][mid] + dp[mid+1][end] ) * 2라고 생각했는데

이건 전체의 합을 나타내야하는데 dp는 최소값을 나태낸 것이기에 달라서

Sum이라는 배열을 추가해서 빼주었다. 

'백준 문제 풀이 & C++ 공부' 카테고리의 다른 글

백준 1149 C++  (0) 2025.03.27
백준 1940 C++  (0) 2025.03.27
백준 11049 C++  (0) 2025.03.26
백준 15468 C++  (0) 2025.03.15
백준 11722 C++  (0) 2025.03.14