zoukankan      html  css  js  c++  java
  • 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;
    }   
           


     

  • 相关阅读:
    771. Jewels and Stones
    706. Design HashMap
    811. Subdomain Visit Count
    733. Flood Fill
    117. Populating Next Right Pointers in Each Node II
    250. Count Univalue Subtrees
    94. Binary Tree Inorder Traversal
    116. Populating Next Right Pointers in Each Node
    285. Inorder Successor in BST
    292. Nim Game Java Solutin
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2570500.html
Copyright © 2011-2022 走看看