记录编号 588148 评测结果 AAAAA
题目名称 不重叠正方形 最终得分 100
用户昵称 Gravatarzxhhh 是否通过 通过
代码语言 C++ 运行时间 1.878 s
提交时间 2024-05-27 18:49:44 内存使用 40.45 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int N = 1005;
  5. typedef long long ll;
  6. int n, m, a[N][N];
  7. ll s[N][N], v[N][N], f[N][4], ans, g[N][N][2], p[N];
  8.  
  9. void solve (int op) {
  10. memset(f, -0x3f, sizeof f); memset(g, -0x3f, sizeof g); memset(p, -0x3f, sizeof p);
  11. for (int i = 1;i <= n;i++) {
  12. for (int j = 1;j <= n;j++) {
  13. s[i][j] = s[i-1][j]+s[i][j-1]-s[i-1][j-1];
  14. if (op == 0) s[i][j] += a[i][j];
  15. if (op == 1) s[i][j] += a[n-i+1][n-j+1];
  16. if (op == 2) s[i][j] += a[n-i+1][j];
  17. if (op == 3) s[i][j] += a[i][n-j+1];
  18. if (op == 4) s[i][j] += a[j][i];
  19. if (op == 5) s[i][j] += a[n-j+1][n-i+1];
  20. if (op == 6) s[i][j] += a[n-j+1][i];
  21. if (op == 7) s[i][j] += a[j][n-i+1];
  22. if (i >= m && j >= m) v[i][j] = s[i][j]-s[i-m][j]-s[i][j-m]+s[i-m][j-m];
  23. else v[i][j] = -1e18;
  24. }
  25. }
  26. for (int i = n;i >= 1;i--) {
  27. for (int j = 1;j <= n;j++) {
  28. g[i][j][0] = max({v[i][j], g[i+1][j][0], g[i][j-1][0]});
  29. }
  30. for (int j = n;j >= 1;j--) {
  31. g[i][j][1] = max({v[i][j], g[i+1][j][1], g[i][j+1][1]});
  32. }
  33. }
  34. for (int i = 1;i <= n;i++) f[i][0] = 0;
  35. for (int i = m;i <= n;i++) {
  36. ll k = 0;
  37. for (int j = m;j <= n;j++) {
  38. k = max(k, v[i][j]);
  39. }
  40. for (int j = 1;j <= 3;j++) f[i][j] = max(f[i-1][j], f[i-m][j-1]+k);
  41. }
  42. ans = max(ans, f[n][3]);
  43. for (int i = m;i <= n;i++) {
  44. p[i] = p[i-1];
  45. for (int j = m;j <= n;j++) {
  46. p[i] = max(p[i], v[i][j]);
  47. }
  48. for (int j = m;j <= n;j++) {
  49. ll k = v[i][j]+p[i-m]+max(g[i][j-m][0], j+m <= n ? g[i][j+m][1] : -0x3f3f3f3f3f3f3f3f);
  50. ans = max(ans, k);
  51. }
  52. }
  53. }
  54.  
  55. int main () {
  56. freopen("zfx.in", "r", stdin);
  57. freopen("zfx.out", "w", stdout);
  58. cin >> n >> m;
  59. for (int i = 1;i <= n;i++) {
  60. for (int j = 1;j <= n;j++) {
  61. cin >> a[i][j];
  62. }
  63. }
  64. for (int i = 0;i < 8;i++) solve(i);
  65. cout << ans;
  66. return 0;
  67. }
  68. /*
  69. 4 1
  70. 1 1 9 1
  71. 1 1 9 1
  72. 1 1 9 1
  73. 1 1 1 1
  74. */