MLE25分求助 回必关
查看原帖
MLE25分求助 回必关
1050426
lxy_qwq楼主2025/7/30 09:49
#include <iostream>
#include <climits>
using namespace std;
#define int long long
const int MAXN = 3000 + 5;
int dp[MAXN][MAXN][2];
int n, m;
main() {
	//对于长度为k的三角形而言,有k/2组成而来
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= i; j++) {
			int x, y;
			cin >> x;
			dp[i][j][0] = x;
		}
	}

	bool zt = 0;
	int len = 1;
	while(len * 2 < m){
		//枚举
		//cout << "I:" << i << endl;
		len *= 2;
		int i = len;
		//cout << "zt:" << zt << endl;
		for (int j = 1; j + i <= n + 1; j++) {
			for (int k = 1; k <= n; k++) {
				//cout << j << " " << k << " " << zt << endl;
				dp[j][k][1 - zt] = max(dp[j][k][1 - zt], dp[j + i / 2][k][zt]);
				dp[j][k][1 - zt] = max(dp[j][k][1 - zt], dp[j + i / 2][k + i / 2][zt]);
				dp[j][k][1 - zt] = max(dp[j][k][1 - zt], dp[j + i / 2][k + i / 4][zt]);
				dp[j][k][1 - zt] = max(dp[j][k][1 - zt], dp[j + i / 4][k][zt]);
				dp[j][k][1 - zt] = max(dp[j][k][1 - zt], dp[j + i / 4][k + i / 4][zt]);
				dp[j][k][1 - zt] = max(dp[j][k][1 - zt], dp[j][k][zt]);
			}
		}
		zt = 1 - zt;
		//cout << len << " " << zt << endl;
	}
	//for (int i = 1; i <= n; i++) {
	//	for (int j = 1; j <= n; j++) {
	//		cout << dp[i][j][1] << ' ';
	//	}
	//	cout << endl;
	//}
	///cout << endl;
	///for (int i = 1; i <= n; i++) {
	//	for (int j = 1; j <= n; j++) {
	//		cout << dp[i][j][0] << ' ';
	//	}
	//	cout << endl;
	//}
	//cout << endl << endl;
	int result = 0;
	for (int i = 1; i + m <= n + 1; i++) {
		for (int j = 1; j <= i; j++) {
			int num = INT_MIN;
			num = max(num, dp[i][j][zt]);
			num = max(num, dp[i + m - len][j][zt]);
			num = max(num, dp[i + m - len][j + m - len][zt]);
			num = max(num, dp[i + (m - len) / 2][j][zt]);
			num = max(num, dp[i + (m - len) / 2][j + (m - len) / 2][zt]);
			num = max(num, dp[i + m - len][j + (m - len) / 2][zt]);

			result += num;
			//cout << result << endl;
		}
	}

	cout << result << endl;

	return 0;
}
2025/7/30 09:49
加载中...