• 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;
    }   
           


     

  • 相关阅读:
    html5-css渐变色
    html5-css综合练习
    html5-css背景
    html5-css边框全
    html5-css边框img
    进程控制(二)与linux下的自有服务
    进程检测与控制(一)
    权限及软件包管理
    linux下文件权限管理
    vim及用户组管理
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2570500.html
Copyright © 2020-2023  润新知