最大子矩阵 问题描述 (m,n)表示一个m行n列的矩阵,求其大小为(x,y)的最大子矩阵。 解题报告 此题我先后采用了三中方式来进行求解,其中最快的算法当属DP。 //1:枚举 TLE int r=m-x,c=n-y,cnt=0; for(int i=0;i<=r;i++)//直接枚举所有可能 for(int j=0;j<=c;j++){ int t=0; for(int l=i;l<i+x;l++) for(int w=j;w<j+y;w++) t+=a[l][w]; if(t>cnt) cnt=t;//记录最优值 } /*2:压缩矩阵后枚举 AC 3131ms 压缩过程: 输入矩阵: 压缩后矩阵: 1 2 3 1 2 3 4 5 6 ----------->> 5 7 9 7 8 9 12 15 18 */ for(int i=1;i<=m;i++) for(int j=1;j<=n;j++){ int tmp;cin>>tmp; a[i][j]=a[i-1][j]+tmp;//输入数据的同时并进行矩阵压缩 } int cnt=0; for(int i=x;i<=m;i++) for(int j=y;j<=n;j++){ int sum=0; for(int k=j-y+1;k<=j;k++) sum+=a[i][k]-a[i-x][k]; if(sum>cnt) cnt=sum;//记录最优值 } //3:动态规划 AC 296ms for(int i=1;i<=n;i++) a[0][i]=0; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++){ int tmp;cin>>tmp; a[i][j]=a[i-1][j]+tmp; } int cnt=0; for(int i=x;i<=m;i++){ sum[y]=0;//求解sum[y]的过程实际是动态规划的初始化过程 for(int k=1;k<=y;k++) sum[y]+=a[i][k]-a[i-x][k]; if(sum[y]>cnt) cnt=sum[y];//记录最优值 for(int j=y+1;j<=n;j++){ sum[j]=sum[j-1]-(a[i][j-y]-a[i-x][j-y])+(a[i][j]-a[i-x][j]);//状态转移方程 if(sum[j]>cnt)cnt=sum[j];//记录最优值 } }