设a[i][j]表示将矩阵压缩成线性序列的前缀和
那么我们在做dp时枚举起点 i 与终点j
最内层枚举行号,那么可以一行一行的累加,
最后更新答案即可
#include<cstdio> #include<algorithm> using namespace std; const int nil=-(1<<29); const int maxn=100; int sum[maxn][maxn]; int main(){ int n; scanf("%d",&n); int p; for (int i=1;i<=n;i++){ for (int j=1;j<=n;j++){ scanf("%d",&p); sum[i][j]=sum[i][j-1]+p; } } int ans=nil; for (int i=1;i<=n;i++){ for (int j=i;j<=n;j++){ int num=0; for (int k=1;k<=n;k++){ if(num<0) num=0; num+=sum[k][j]-sum[k][i-1]; ans=max(ans,num); } } } printf("%d ",ans); return 0; }