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