NYOJ 104(最大子矩阵和)

 

此代码在全为-2时,输出0,显然错误,因为函数下标从0开始,而传递的参数希望他从1开始

#include<stdio.h>
#include<string.h>
int a[101][101],b[10010];
int subsequencesum(int a[],int n)
{
 int sum=0,maxsum=0,i;
 for(i=0;i<n;i++)
 {
  sum+=a[i];
  if(sum>maxsum)
   maxsum=sum;  
  else
   if(sum<0)
    sum=0;
 }
 return maxsum;
}
int main()
{
 int i,j,T,p,k;int col,row,m;int max,ans,sum,cnt;
 scanf("%d",&T);
 while(T--)
 {
  max=-0x7fffffff,ans=-0x7fffffff;
  memset(a,0,sizeof(a));
  scanf("%d%d",&row,&col);
  for(i=1;i<=row;i++)
   for(j=1;j<=col;j++)
    scanf("%d",&a[i][j]);
  for(i=1;i<=row;i++)
  {
   memset(b,0,sizeof(b));
   cnt=1;;
   for(j=i;j<=row;j++)
    {
     for(k=i;k<=j;k++)  
      {
       sum=0;
       for(m=1;m<=col;m++)
       sum+=a[k][m];
       b[cnt++]=sum;
      }
    }
   max=subsequencesum(b,cnt-1);
   if(ans<max)
    ans=max;
  }
  printf("%d\n",ans);
 }
  return 0;
}
   

 

 


//改过后,超时,确实麻烦啦
#include<stdio.h>
#include<string.h>
int a[101][101],b[10010];
int subsequencesum(int a[],int n)
{
 int sum=0,maxsum=-0x7fffffff,i;
 for(i=0;i<n;i++)
 {
  sum+=a[i+1];
  if(sum>maxsum)
   maxsum=sum;  
  else
   if(sum<0)
    sum=0;
 }
 return maxsum;
}
int main()
{
 int i,j,T,p,k;int col,row,m;int max,ans,sum,cnt;
 scanf("%d",&T);
 while(T--)
 {
  max=-0x7fffffff,ans=-0x7fffffff;
  memset(a,0,sizeof(a));
  scanf("%d%d",&row,&col);
  for(i=1;i<=row;i++)
   for(j=1;j<=col;j++)
    scanf("%d",&a[i][j]);
  for(i=1;i<=row;i++)
  {
   cnt=1;
   for(j=i;j<=row;j++)
    {
     //memset(b,0,sizeof(b));
     for(k=i;k<=j;k++)  
      {
       sum=0;
       for(m=1;m<=col;m++)
       sum+=a[k][m];
      // printf("%d\n",sum);
       b[cnt++]=sum;
      }
     max=subsequencesum(b,cnt-1);
      //printf("%d   %d     %d\n",sum,max,ans);
     if(ans<max)
      ans=max;
    }
  }
  printf("%d\n",ans);
 }
 return 0;
}
   

 

//改成函数调用也超时


//改过后,超时,确实麻烦啦
#include<stdio.h>
#include<string.h>
int a[101][101],b[10010];
int cnt,col,row;
int subsequencesum(int a[],int n)
{
 int sum=0,maxsum=-0x7fffffff,i;
 for(i=0;i<n;i++)
 {
  sum+=a[i+1];
  if(sum>maxsum)
   maxsum=sum;  
  else
   if(sum<0)
    sum=0;
 }
 return maxsum;
}
void total(int i,int j)
{
 int sum,k,m;
 for(k=i;k<=j;k++)  
 {
  sum=0;
  for(m=1;m<=col;m++)
   sum+=a[k][m];
  b[cnt++]=sum;
 }
}
int main()
{
 int i,j,T,p,k;int m;int max,ans,sum;
 scanf("%d",&T);
 while(T--)
 {
  max=-0x7fffffff,ans=-0x7fffffff;
  memset(a,0,sizeof(a));
  scanf("%d%d",&row,&col);
  for(i=1;i<=row;i++)
   for(j=1;j<=col;j++)
    scanf("%d",&a[i][j]);
  for(i=1;i<=row;i++)
  {
   cnt=1;
   for(j=i;j<=row;j++)
    {
     //memset(b,0,sizeof(b));
     total(i,j);
     max=subsequencesum(b,cnt-1);
      //printf("%d   %d     %d\n",sum,max,ans);
     if(ans<max)
      ans=max;
    }
  }
  printf("%d\n",ans);
 }
 return 0;
}
   

 

 

 

 

 

//AC 

#include<stdio.h>
#include<string.h>
int a[101][101],b[101];
int subsequencesum(int a[],int n)
{
 int sum=0,maxsum=-0x7fffffff,i;
 for(i=1;i<=n;i++)
  if(maxsum<a[i])
   maxsum=a[i];
 if(maxsum<=0)
  return maxsum;
 for(i=0;i<n;i++)
 {
  sum+=a[i+1];
  if(sum>maxsum)
   maxsum=sum;  
  else
   if(sum<0)
    sum=0;
 }
 return maxsum;
}     
int main()
{
   int col,row,max,ans,temp;int i,j,k,T,m;
   scanf("%d",&T);
   while(T--)
  {
     temp=ans=max=-0x7fffffff;
     scanf("%d%d",&row,&col);
     for(i=1;i<=row;i++)
      for(j=1;j<=col;j++)
       scanf("%d",&a[i][j]);
     for(i=1;i<=row;i++)
     {      
       memset(b,0,sizeof(b));
       for(j=i;j<=row;j++)
       {
          for(k=1;k<=col;k++)
          {
           b[k]+=a[j][k];
          }
          ans=subsequencesum(b,col);
         if(temp<ans)
          temp=ans;
       }
     }
     printf("%d\n",temp);
  }
  return 0;
}   
       

 


 

 

你可能感兴趣的:(矩阵)