2009-03-29 19:02:47來源不明

ACM 108 Maximum Sum

Sagit的程式碼

http://www.tcgs.tc.edu.tw/~sagit/acm/view.php?id=108 

在此說明

先把每一列的數字一直往右邊加

之後只要設定寬就直接長的尾巴與開頭去減即可

之後再設定 x跟y座標 再往左伸[寬增加] 下伸[長增加]

/***********************************************************/

#include<stdio.h>
#include<stdlib.h>
main()
{
 int n;
 while(scanf("%d",&n)==1)
   {
    int a,b,c,d,temp,max=0,map[71][71],x[71][71];
    for(a=1;a<=n;a++)
     for(b=1;b<=n;b++)
       {
        scanf("%d",&x[a][b]);
        map[a][b]=map[a][b-1]+x[a][b];
       }
     for(a=1;a<=n;a++)   /*X*/
      for(b=1;b<=n;b++)    /*Y*/
       for(c=b;c<=n;c++)    /*往右邊伸*/
        for(d=a,temp=0;d<=n;d++)  /*往下伸*/
         {
           temp=temp+map[d][c]-map[d][b-1];
           if(temp>max) max=temp;
         }
     printf("%d\n",max);
   }
 return 0;
}

/*****************teching所提供的↓更快**************************/
#include<stdio.h>     
#include<stdlib.h>     
main()     
{     
 int n;     
 while(scanf("%d",&n)==1)     
   {     
    int a,b,c,d,temp,max=-1000000,x[101][101],flag=0;      
    for(a=1;a<=n;a++)     
     for(b=1;b<=n;b++)     
       {     
        scanf("%d",&x[a][b]);     
        if(x[a][b]>0) flag=1;    
       }
    
     if(flag==1)
       {
         for(a=1;a<=n;a++)
          {
           int sum[101]={0};
             for(b=a;b<=n;b++)
               for(c=1;c<=n;c++)
                 {
                  sum[c]=sum[c]+x[b][c];
                   if(c==1||temp<0) temp=0;
                   temp+=sum[c];
                   if(temp>max) max=temp;
                 }
          }
       }  
      else
       for(a=1;a<=n;a++)
        for(b=1;b<=n;b++)
         if(x[a][b]>max) max=x[a][b];  
     printf("%d\n",max);     
   }      
 return 0;     
}  

上一篇:ACM 668 Parliament

下一篇:ACM 439 Knight Moves