社区讨论

震惊!

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

讨论操作

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

当前回复
15 条
当前快照
1 份
快照标识符
@mi85y7qv
此快照首次捕获于
2025/11/21 09:10
4 个月前
此快照最后确认于
2025/11/21 09:46
4 个月前
查看原帖
为什么这道题我用__int128
如果不开O2就能A
开了O2第7个点以后就错了
CPP
#include <bits/stdc++.h>
#define max(a,b) (((a)>(b))?(a):(b))
#define MAX (80+10)
using namespace std;

int N,M,d[MAX][MAX];
__int128 B,sum,ans,f[MAX][MAX];

inline void read(int &a)
{
    register char c = getchar();
    for (a=0; c<'0'||'9'<c; c=getchar());
    for (; '0'<=c && c<='9'; c=getchar())
        a *= 10, a += c ^ 48;
}

inline void write(const __int128 a)
{
	if (a > 9) write(a/10);
	putchar((a % 10) ^ 48);
}

int main()
{
	read(N); read(M);
	for (register int i=1; i<=N; i++)
		for (register int j=1; j<=M; j++)
			read(d[i][j]);
	for (register int T=1; T<=N; T++)
	{
		B = 1; sum = 0;
		memset(f,0,sizeof f);
		for (register int S=1; S<=M; S++)
		{
			B <<= 1;
			for (register int L=0,R=S-L; L<=S; L++,R--)
				f[L][R] = max(f[L-1][R] + B*d[T][L], f[L][R-1] + B*d[T][M-R+1]);
		}
		for (register int i=0; i<=M; i++)
			sum = max(sum,f[i][M-i]);
		ans += sum;
	}
	write(ans);
}

回复

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

正在加载回复...