scau实验题 9491 最大子矩阵和
裸题,最大子矩阵和,将二维压缩为一维,以行为准,每次枚举一行的和(从i列到j列的和),再对行进行最大子序列和DP求解,时间复杂度为O(N^3)
#include <stdio.h> #include <string.h> #define INF -1000000000 #define N 110 int a[N][N]; int sum[N]; int n; void input() { int i,j; scanf("%d",&n); for(i=1; i<=n; i++) for(j=1; j<=n; j++) scanf("%d",&a[i][j]); return ; } void get_sum(int i , int j) { int t,c; //代表行 memset(sum,0,sizeof(sum)); for(c=1 ; c<=n ;c++) { for(t=i; t<=j; t++) sum[c]+=a[c][t]; } return ; } int DP() { int i,TMPSUM,SUM; TMPSUM=SUM=0; for(i=1; i<=n; i++) //代表行 { TMPSUM+=sum[i]; if(TMPSUM>SUM) SUM=TMPSUM; else if(TMPSUM<0) TMPSUM=0; } return SUM; } int main() { int i,j,ans,max; input(); max=INF; for(i=1; i<=n; i++) for(j=i; j<=n; j++) { get_sum(i,j); //压缩二维空间为一维,求出每一行的i列到j列的连续和,再按行来进行DP求解 ans=DP(); max=ans>max ? ans : max; } printf("%d\n",max); return 0; }