社区讨论

为什么开了unsigned int 128还是过不了/dk

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

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@mhjdectv
此快照首次捕获于
2025/11/04 00:44
4 个月前
此快照最后确认于
2025/11/04 00:44
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define N 85
#define int unsigned __int128
using namespace std;
int n,m,a[N][N],dp[N][N][N];
void read(int &n){
	char a=getchar();
	while(a>'9'||a<'0')
		a=getchar();
	while(a>='0'&&a<='9'){
		n=n*10+a-'0';
		a=getchar();
	}
}
void pr(int n){
	if(n>9)
		pr(n/10);
	putchar(n%10+'0');
}
signed main(){
//	ios::sync_with_stdio(0);
//	cout.tie(0);
	read(n),read(m);
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			read(a[i][j]);
		}
		dp[2][m][i]=(a[i][1]<<1);
		dp[1][m-1][i]=(a[i][m]<<1);
	}
	if(m>2){
		for(int k=1;k<=n;++k){
			for(int len=m-2;len>0;--len){
				for(int i=1;i+len-1<=m;++i){
					int j=i+len-1,od=m-len;
					dp[i][j][k]=max(dp[i-1][j][k]+a[k][i-1]*(1ll<<od),dp[i][j+1][k]+a[k][j+1]*(1ll<<od));
				}
			}
		}
	}
	int ans=0;
	for(int i=1;i<=n;++i){
		int mx=0;
		for(int j=1;j<=m;++j)
			mx=max(mx,dp[j][j][i]+(1ll<<m)*a[i][j]);
		ans+=mx;
	}
	pr(ans);
//	cout.flush();
	return 0;
}

回复

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

正在加载回复...