刚上手区间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);
}