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

 


 

 

目录
相关文章
|
API
NYOJ 540
  为了给学弟学妹讲课,我水了一道题…… import java.util.Arrays; import java.util.Scanner; public class NYOJ540 { public static void main(String[] args) { ...
802 0
|
JavaScript
NYOJ&#160;17
时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 题目很经典,学习一下吧。
646 0
NYOJ 205
  求余数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数除10003之后的余数   输入 第一行有一个整数m(1T; 13 scanf("%*c")...
667 0
NYOJ 86
  找球号(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号i(0
789 0
|
测试技术
NYOJ 202
  红黑树 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子是红色的树。。。 当然,这个是我说的。
799 0
|
测试技术
NYOJ 523
  亡命逃窜 时间限制:1000 ms | 内存限制:65535 KB 难度:4   描述   从前有个叫hck的骑士,为了救我们美丽的公主,潜入魔王的老巢,够英雄吧。不过英雄不是这么好当的。
901 0
|
机器学习/深度学习 人工智能 算法
NYOJ 148
  fibonacci数列(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:3   描述 In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2.
830 0
NYOJ 27
  水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。
765 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.
661 0
|
网络协议
NYOJ 8
  一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);1.
766 0