時間限制:1 秒
內存限制:128 兆
特殊判題:否
提交:850
解決:178
在一個M * N的矩陣中,所有的元素只有0和1,從這個矩陣中找出一個面積最大的全1子矩陣,所謂最大是指元素1的個數最多。
輸入可能包含多個測試樣例。
對於每個測試案例,輸入的第一行是兩個整數m、n(1<=m、n<=1000):代表將要輸入的矩陣的大小。
矩陣共有m行,每行有n個整數,分別是0或1,相鄰兩數之間嚴格用一個空格隔開。
對應每個測試案例,輸出矩陣中面積最大的全1子矩陣的元素個數。
2 2 0 0 0 0 4 4 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0
0 4
#includeint dp[1005][1005];//dp[i][j]代表位置(i,j)左上角矩陣之和 int a[1005][1005]; int main() { int n,m; for(int i=0;i<=1000;i++) dp[0][i]=dp[i][0]=0; while(scanf("%d%d",&n,&m)>0) { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); int sum=0; for(int i=1;i<=n;i++)//處理 { sum=0; for(int j=1;j<=m;j++) { sum+=a[i][j]; dp[i][j]=dp[i-1][j]+sum; } } int maxk=0; for(int i=n;i>0;i--) for(int j=m;j>0&&maxk=0)//先只有一行時向左擴展 { if(dp[i][j]-dp[i][j-c]-dp[i-r][j]+dp[i-r][j-c]==r*c) { if(maxk =0&&c>0)//有多行時向現擴展,有可能列要往回縮 { if(dp[i][j]-dp[i][j-c]-dp[i-r][j]+dp[i-r][j-c]==r*c) { if(maxk