a11 a12 a13 a14 a15
a21 a22 a23 a24 a25
a31 a32 a33 a34 a35
a41 a42 a43 a44 a45
a51 a52 a53 a54 a55
枚举矩阵每一列的区间,当成最长子串的dp方式就能过了
你把a21 a31 a41 看成一个元素,值是这三个元素的和,后面的列同理
https://www.cnblogs.com/GodA/p/5237061.html
这个人讲的非常好
#include<iostream> #include <cstdio> using namespace std; const int maxn = 105; int arr[maxn][maxn]; int sum[maxn][maxn]; int main() { int n; scanf("%d",&n); for(int i = 1; i <= n; ++i ) { for(int j = 1; j <= n; ++j) { scanf("%d",&arr[i][j]); } } for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) { sum[i][j] = sum[i][j-1] + arr[j][i]; } } /*for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) { printf("%d\n",sum[i][j]); } }*/ int maix = 0; for(int i = 1; i <= n; ++i) { for(int j = i+1; j <= n; ++j) { int b = 0; for(int k = 1; k <= n; ++k ) { if(b > 0) { b += sum[k][j] - sum[k][i]; } else { b = sum[k][j] - sum[k][i]; } if(b > maix) maix = b; } } } printf("%d\n",maix); }