NYOJ 104(最大子矩阵和)

简介:   此代码在全为-2时,输出0,显然错误,因为函数下标从0开始,而传递的参数希望他从1开始 #include#include int a[101][101],b[10010];int subsequencesum(int a[],int n){ int sum=0,maxsum=0,i; f...

 

此代码在全为-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;
}   
       

 


 

 

目录
相关文章
|
7月前
|
算法
NYOJ-448-寻找最大数
NYOJ-448-寻找最大数
31 0
|
人工智能 算法
|
测试技术
NYOJ 541
  最强DE 战斗力 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 春秋战国时期,赵国地大物博,资源非常丰富,人民安居乐业。但许多国家对它虎视眈眈,准备联合起来对赵国发起一场战争。
773 0
|
人工智能 测试技术
NYOJ&#160;79
拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意 的高度,但是以后每一发炮弹都不能高于等于前一发的高度。
960 0
NYOJ 283
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 /* 9 bool cmp(char *a,char *b) 10...
489 0
NYOJ 113
1 #include 2 #include 3 using namespace std; 4 5 int main() 6 { 7 int pos=-1; 8 string s; 9 while(getline(cin,s)) 10 { 11 while((pos=s.
682 0
NYOJ 93
  汉诺塔(三) 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。
601 0
NYOJ 86
  找球号(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号i(0
811 0