首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有没有能的? -【ACM】【ZOJ1074】最大子矩阵和

2013-05-02 
有没有会的??? -----【ACM】【ZOJ1074】最大子矩阵和Problem Description给你一个m×n的整数矩阵,在上面找一个x

有没有会的??? -----【ACM】【ZOJ1074】最大子矩阵和
Problem Description
给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大。
 

Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每一组测试数据的第一行为四个正整数m,n,x,y(0<m,n<1000 AND 0<x<=m AND 0<y<=n),表示给定的矩形有m行n列。接下来这个矩阵,有m行,每行有n个不大于1000的正整数。
 

Output
对于每组数据,输出一个整数,表示子矩阵的最大和。
 

Sample Input
14 5 2 23 361 649 676 588992 762 156 993 169662 34 638 89 543525 165 254 809 280 

Sample Output
2474 




求助,为什么我的代码会WA, 不想要标程哈, 哪位大牛帮忙讲解下行吗!!!!


我的代码(很暴力, 不过好像不会超时 就是WA):

# include <stdio.h>
# include <string.h>
# define N 1000
int arr[N+1][N+1];
int sum[N+1][N+1];
int temp[N+1][N+1];
int main()
{
int t, i, j, x, y, m, n, max,mid;
scanf("%d", &t);
while (t--)
{
scanf("%d %d %d %d", &m, &n, &x, &y);
memset(sum, 0, sizeof(sum));
for (i=1; i<=m; ++i)
{
for (j=1; j<=n; ++j)
{
scanf("%d", &arr[i][j]);
sum[i][j] = sum[i-1][j] + arr[i][j];
}
}
for (i=x; i<=m; ++i)
{
for (j=1; j<=n; ++j)
{
temp[i][j] = sum[i][j] - sum[i-x][j];//temp存竖下来的值
}
}
for (i=x; i<=m; ++i)
{
for (j=y; j<=n; ++j)
{
mid = 0;
for (int k=0; k<y; ++k)
{
mid += temp[i][j-k];
}
printf("%d   ", mid);
if (mid > max)
max = mid;
}
printf("\n");
}
printf("%d\n", max);
}
return 0;
}
[解决办法]
int CreateArray2D(int ** &A,int N,int M)
{
  ret = -1;
  if(!A){
     A = new int *[N];
     for(int i=0;i<N;++i)
       A[i] = new int[M];
     ret = 0;
     }
  return ret;
}
int InputArray2D(int **A,int N,int M)
{
  int ret = -1;
  if(A){
    for(int i=0;i<N;++i){
      for(int j=0;j<M;++j){
        cout << "A["<<i+1<<"]["<<j+1<<"]:";
        cin >> A[i][j];}
      cout << "--------------"<<i+1<<"-----------"<<endl;}
    ret = 0; 
    }
  return ret;
}

void FreeArray2D(int ** &A,int N,int M)
{
   if(A){
     for(int i=0;i<N;++i)
       if(A[i]){delete []A[i];A[i]=0;}
     delete []A;
     A = 0;}


}  
  
int main()
{
   ret = -1;
   int n,m,x,y,**a=0,max,t,xi=-1,yi=-1;
   cout << "矩阵 行 列:";
   cin >> n >> m;
   cout << "子矩阵 行 列:";
   cin >> x >> y;
   if (n<=0
[解决办法]
m<=0
[解决办法]
x<=0
[解决办法]
x>n
[解决办法]
y<=0
[解决办法]
y>m)
      return ret;
   if(CreateArray2D(a,n,m))return ret;
   if(InputArray2D(a,n,m))return ret;
   max = 0xffffffff;
   for(int i=0,ilimit=n-x;i<ilimit;++i)
     for(int j=0;jlimit=m-y;j<jlimit;++j)
       if((t=MaxArray2D(a,n,m,x,y,i,j))>max){
         max = t;
         xi = i; yi =j;}
   if(xi>=0 && yi>=0){
     for(int i=xi,ii=0;ii<x;++i,++ii){
       for(int j=yi,jj=0;jj<y;++j,++jj)
         cout << a[i][j] << "  ";
       cout << endl;}
     cout << "最大元素和是:"<< max <<endl;}
  FreeArray2D(a,n,m);
  ret = 0;
  return ret;
}
[解决办法]
编程不仅仅是满足个人喜好,可复用与验证代码可以避免很多重复的劳动。
代码本身没有问题,只是不便查错而已,太多的不必要中间存储容易干扰阅读与故障排查。小而简单的代码要比大而全的代码灵活方便得多。

热点排行