P10463 To the Max 题解
首先枚举
时间复杂度
#include <bits/stdc++.h>
using namespace std;
int a[505][505],s[505][505],f[505]; //s[j][i]表示第j列的第1~i个数的和
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n; cin >> n;
for(int i = 1;i <= n;i++) {
for(int j = 1;j <= n;j++) {
cin >> a[i][j];
}
}
for(int j = 1;j <= n;j++) {
for(int i = 1;i <= n;i++) {
s[j][i] = s[j][i-1] + a[i][j];
}
}
int ans = -0x7fffffff;
for(int i = 1;i < n;i++) {
for(int j = i+1;j <= n;j++) {
for(int k = 1;k <= n;k++) f[k] = max(f[k-1]+s[k][j]-s[k][i-1],s[k][j]-s[k][i-1]);
ans = max(ans,*max_element(f+1,f+n+1));
}
}
cout << ans << endl;
return 0;
}