萌新求助
  • 板块学术版
  • 楼主NicolasSU
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/3 18:14
  • 上次更新2023/11/3 20:20:48
查看原帖
萌新求助
556238
NicolasSU楼主2023/11/3 18:14

刚上手区间DP P1005 开unsigned __int128只AC了一个点,数据下载下来以后都过了这是怎么回事?

附代码附代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>

using namespace std;

unsigned __int128 MAX(unsigned __int128 a, unsigned __int128 b)
{
	if(sizeof(a) > sizeof(b)) return a;
	else if(sizeof(a) < sizeof(b)) return b;
	else return max(a, b);
}

unsigned __int128 read(void)
{
	unsigned __int128 x = 0;
	char c = getchar();
	while(c >= '0' && c <= '9') { x = x * 10 + (c - '0'); c = getchar(); }
	return x;
}

void write(unsigned __int128 x)
{
	if(x / 10) write(x / 10);
	putchar(char((x % 10) + '0'));
}

const int MAXN = 5e2;
unsigned __int128 Ans = 0, dp[MAXN][MAXN], a[MAXN][MAXN];
int n, m;

unsigned __int128 quick_pow(int s)
{
	unsigned __int128 ans = 1, k = 2;
	while(s)
	{
		if(s % 2) ans *= k;
		k *= k, s /= 2;
	}
	return ans;
}

void go(int x)
{
	memset(dp, 0, sizeof(dp));
	for(int i = 1; i <= m; i++) dp[i][i] = a[x][i] * quick_pow(m);
	for(int len = 1; len <= m; len++)
		for(int i = 1; i + len <= m; i++)
		{
			int j = i + len;
			dp[i][j] = MAX(dp[i][j], dp[i + 1][j] + a[x][i] * quick_pow(m - len));
			dp[i][j] = MAX(dp[i][j], dp[i][j - 1] + a[x][j] * quick_pow(m - len));
		}
	Ans += dp[1][m];
}

int main(void)
{
	n = read(), m = read();
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			a[i][j] = read();
	for(int i = 1; i <= n; i++) go(i);
	write(Ans);
}
2023/11/3 18:14
加载中...