Submission #1227403

#TimeUsernameProblemLanguageResultExecution timeMemory
1227403lance0Raisins (IOI09_raisins)C++20
100 / 100
167 ms24884 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
	int n,m; cin >> n >> m;
	int arr[n][m] = {};
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> arr[i][j];
		}
	}
	int pref[n][m] = {};
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			pref[i][j] = arr[i][j];
			if (j > 0) {
				pref[i][j] += pref[i][j-1];
			}
			if (i > 0) {
				pref[i][j] += pref[i-1][j];
			}
			if (i > 0 and j > 0) {
				pref[i][j] -= pref[i-1][j-1];
			}
		}
	}
	int dp[n][m][n][m] = {};
	//dimensions
	for (int k = 0; k < n; k++) {
		for (int l = 0; l < m; l++) {
			// top left corner
			for (int i = 0; i+k < n; i++) {
				for (int j = 0; j+l < m; j++) {
					if (k == 0 and l == 0) {
						dp[i][j][i+k][j+l] = 0;
					} else {
						dp[i][j][i+k][j+l] = 2e9;
						//main dp process
						for (int x = 0; x < k; x++) {
							//consider cutting a strip of x*l
							//so e.g. a 3x4 would consider 1x4,2x4 and 2x4,1x4 cuts
							dp[i][j][i+k][j+l] = min(dp[i][j][i+k][j+l], dp[i][j][i+x][j+l]+dp[i+x+1][j][i+k][j+l]);
						}
						for (int x = 0; x < l; x++) {
							//consider cutting a strip of k*x
							dp[i][j][i+k][j+l] = min(dp[i][j][i+k][j+l], dp[i][j][i+k][j+x]+dp[i][j+x+1][i+k][j+l]);
						}
						//no matter what, this costs a specified amount to do any cut on
						dp[i][j][i+k][j+l] += pref[i+k][j+l];
						if (i > 0) {
							dp[i][j][i+k][j+l] -= pref[i-1][j+l];
						}
						if (j > 0) {
							dp[i][j][i+k][j+l] -= pref[i+k][j-1];
						}
						if (i > 0 and j > 0) {
							dp[i][j][i+k][j+l] += pref[i-1][j-1];
						}
					}
				}
			}
		}
	}
	cout << dp[0][0][n-1][m-1];
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...