就是最大矩阵和,如果直接爆搜复杂度就是O(n4)的所以进行优化,sum[i][j][k]表示在第i列到第j列的第k行的和,那么就枚举i, j然后最大子段和,然后就变成O(n3)了, 反正n只有100就过了
#include#include #include using namespace std;const int MAXN = 100;int sum[MAXN+10][MAXN+10][MAXN+10], dp[MAXN+10];int main(){ int n; scanf("%d", &n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d", &sum[j][j][i]); int ans = 0; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++){ for(int k=1;k<=n;k++) sum[i][j][k] = sum[i][j-1][k]+sum[j][j][k]; for(int k=1;k<=n;k++) ans = max(ans, (dp[k] = (dp[k-1]<0?sum[i][j][k]:dp[k-1]+sum[i][j][k]))); } printf("%d\n", ans); return 0;}