你有一张 n 行 m 列的网格纸,每个格子上有一个整数。对于一张网格纸 X,定义 w(X) 为 X 所有格子
上的整数之和。
在裁纸游戏中,你可以通过如下规则得分(初始分数为 0):
选择一张网格纸 Y ,将 Y 沿着非边界的网格线(相邻的两行或两列之间的线,而不是边界)剪开,得
到两张新的网格纸 Y1, Y2。通过这次裁剪,你可以获得 w(Y1) × w(Y2) 的分数。
你可以进行任意次(包括零次)的裁剪操作,试最大化你的得分,并输出这个分数。
Input
第一行包含两个正整数 n, m(1 ≤ n × m ≤ 10^6 ).
接下来 n 行,每行 m 个整数,每个整数>0且小于10^3
Output
一行一个整数,表示可能的最大得分。

题解:
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long pre,ans,a;
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%lld",&a);
ans+=pre*a;
pre+=a;//当前元素的前缀和
}
printf("%lld",ans);//答案为所有两两不相同的点的乘积的和
return 0;
}
时间复杂度O(nm)