题解里 d 数组是存矩阵和的
根据题目里面“注意:收益可能是负数,养马也不是包赚的,马匹也可能出现生病死亡等意外。”这一句,矩阵和出现负数可能导致越界。
为此我开了 map,TLE 了好几次,改成普通数组就过了。求助各位巨佬是什么原因。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
const int N = 53;
int n, ans = 0, a[N][N], sum[N][N][N][N], sum2[N][N][N][N], f[11111111];
//原先的 f 数组是 map
int main()
{
scanf("%d", &n);
memset(sum, 0, sizeof(sum));
memset(sum2, 0, sizeof(sum2));
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
sum[i][j][i][j] = a[i][j];
for(int k = i; k <= n; k++)
for(int h = j; h <= n; h++)
sum[i][j][k][h] = a[k][h] + sum[i][j][k - 1][h] +
sum[i][j][k][h - 1] - sum[i][j][k - 1][h - 1];
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
sum2[i][j][i][j] = a[i][j];
for(int k = i; k > 0; k--)
for(int h = j; h <= n; h++)
sum2[i][j][k][h] = a[k][h] + sum2[i][j][k + 1][h] +
sum2[i][j][k][h - 1] - sum2[i][j][k + 1][h - 1];
}
for(int i = 2; i <= n; i++)
for(int j = 2; j <= n; j++)
{
for(int k = i - 1; k > 0; k--)
for(int h = j - 1; h > 0; h--)
f[sum[k][h][i - 1][j - 1]]++;
for(int k = i + 1; k <= n + 1; k++)
for(int h = j + 1; h <= n + 1; h++)
ans += f[sum[i][j][k - 1][h - 1]];
for(int k = i - 1; k > 0; k--)
for(int h = j - 1; h > 0; h--)
f[sum[k][h][i - 1][j - 1]] = 0;
for(int k = i + 1; k <= n + 1; k++)
for(int h = j - 1; h > 0; h--)
f[sum2[k - 1][h][i][j - 1]]++;
for(int k = i - 1; k > 0; k--)
for(int h = j + 1; h <= n + 1; h++)
ans += f[sum2[i - 1][j][k][h - 1]];
for(int k = i + 1; k <= n + 1; k++)
for(int h = j - 1; h > 0; h--)
f[sum2[k - 1][h][i][j - 1]] = 0;
}
printf("%d", ans);
return 0;
}