社区讨论

爆__int128怎么办

P1005[NOIP 2007 提高组] 矩阵取数游戏参与者 5已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mhjlg73w
此快照首次捕获于
2025/11/04 04:29
4 个月前
此快照最后确认于
2025/11/04 04:29
4 个月前
查看原帖
rt,实在不想写高精,如果有大佬帮忙加上就万分感谢
CPP
#include <iostream>
using namespace std;

const int MAXN = 80, MAXM = 80;
int n, m;

int a[MAXN + 5][MAXM + 5];

__int128 powOf2[MAXM + 5];
void preprocess() {
	powOf2[0] = 1;
	for(int i = 1; i <= m + 1; ++i)
		powOf2[i] = powOf2[i - 1] + powOf2[i - 1];
}

__int128 dp[MAXN + 5][MAXN + 5];
__int128 rowAns(int i) {
	for(int j = 0; j <= m + 1; ++j)
		for(int k = 0; k <= m + 1; ++k)
			dp[j][k] = 0;
	for(int len = m; len >= 0; --len)
		for(int j = 1; j <= m - len + 1; ++j) {
			int k = j + len;
			dp[j][k] = max(dp[j - 1][k] + a[i][j - 1] * powOf2[m - len], dp[j][k + 1] + a[i][k] * powOf2[m - len]);
		}
	__int128 res = 0;
	for(int j = 1; j <= m; ++j)
		res = max(res, dp[j][j]);
	return res;
}

void output(__int128 x) {
	if(x == 0)
		cout << 0;
	while(x > 0) {
		cout << (long long)(x % (long long)1e18);
		x /= (long long)1e18;
	}
}

int main() {
	cin >> n >> m;
	for(int i = 0; i < n; ++i) {
		for(int j = 1; j <= m; ++j) {
			cin >> a[i][j];
		}
	}
	
	preprocess();
	__int128 ans = 0;
	for(int i = 0; i < n; ++i)
		ans += rowAns(i);
	output(ans);
}

回复

8 条回复,欢迎继续交流。

正在加载回复...