| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
1066: 最大子矩阵 
题目描述 
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。 
 
比如,如下4 * 4的矩阵 
 
0 -2 -7 0 
9 2 -6 2 
-4 1 -4 1 
-1 8 0 -2 
 
的最大子矩阵是 
 
9 2 
-4 1 
-1 8 
 
这个子矩阵的大小是15。 
输入 
输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[-127, 127]。 
输出 
输出最大子矩阵的大小。 
样例输入 复制 
4 
0 -2 -7 0 
9 2 -6 2 
-4 1 -4 1 
-1 8 0 -2 
样例输出 复制 
15 
 
#include <stdio.h> 
#pragma warning(disable:4996) 
int main(void) 
{ 
        int n, i, j; 
        int dig[20][20] = { 0 }, cpy[20][20] = { 0 }; 
 
        scanf("%d",&n); 
        for (i = 0; i < n; i++) { 
                for (j = 0; j < n; j++) { 
                        scanf("%d", &dig[i][j]); 
                } 
        } 
 
        for (i = 0; i < n; i++) { 
                for (j = 0; j < n; j++) { 
                        int x = i; 
                        while (x >= 0 ) { 
                                cpy[i][j] += dig[x][j]; 
                                x--; 
                        } 
                } 
        } 
         
        int max = 0; 
        for (i = 0; i < n;i++){//对每一行进行最大字段和的判断  
                int tmp_1[20] = {0}; 
                int tmp_2[20] = {0}; 
                 
                for (j = 0; j < n;j++){ 
                        tmp_1[j] = cpy[i][j]; 
                        tmp_2[j] = cpy[i][j]; 
                } 
                 
                for(j = 1;j < n;j++){ 
                        if (tmp_2[j-1] > 0){ 
                                tmp_2[j] = tmp_2[j-1] + tmp_1[j]; 
                        } 
                        if (tmp_2[j] > max){ 
                                max = tmp_2[j]; 
                        } 
                }  
        } 
         
        printf("%d",max); 
 
        return 0; 
} 
 
请问这个C语言程序怎么改才能输出正确结果? |   
 
 
 
 |