问题标题: 酷町堂:1290 糖果盒(candybox)

0
0
已解决
汪恺恒
汪恺恒
中级启示者
中级启示者

题目描述 Description

卡卡西帮影院经理解决了难题,终于可以和妈妈安心的观看了电影。电影太精彩了,卡卡西在电影放映过程中,多次拍手叫好。放映结束后,卡卡西正准备和妈妈牵手回家,被影院经理拦住了。那位和蔼的叔叔满脸笑容的对卡卡西说:“小朋友,谢谢你之前帮我解决了难题,这可帮了我一个大忙啊!作为对你的感谢,我想赠送你这个糖果盒。这个糖果盒可不一般哦,只有足够聪慧,回答对问题并完成任务的小朋友,才能从中取出糖果”。
卡卡西痴迷的望着这个金光闪闪的糖果盒,瞪大的双眼里充满了好奇。这是一个被分为N*M个格子的飘着芳香的糖果盒,第i行第j列位置的格子里面有a[i][j]颗糖。但是经理告诉卡卡西,不幸的是,前一天晚上,一只极其可恶的老鼠夜袭糖果盒,有部分格子被洗劫并且穿了洞。为了让糖果盒保持美观,必须从这个糖果盒里面切割出一个新的不能有洞的矩形糖果盒,并且卡卡西希望保留在新糖果盒内的糖的总数尽量多,这样她就能吃到尽可能多的糖。
小朋友们,请你们帮卡卡西设计一个程序,计算一下新糖果盒里最多能够保留多少糖果,从而使卡卡西获得这个糖果礼盒。

输入描述 Input Description

共N+1行,第一行有两个正整数N和M(1≤N≤300,1≤M≤300)。后面N行每行M个正整数,第i+1行的第j个正整数a[i][j](0≤a[i][j]≤255),表示糖果盒的第i行第j个格子里的糖果个数,如果这个数为0,则表示这个位置的格子被老鼠洗劫过,即该位置是个洞。

输出描述 Output Description

输出一个正整数,即能得到的最大糖果数。

 

这个WA40真的很让人。。。

#include<iostream>
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int ans,a[305][305];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int x;
            cin>>x;
            if(x==0) x=-inf;
            a[i][j]=a[i-1][j]+x;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=i;j<=n;j++){
            int sum=0;
            for(int k=1;k<=m;k++){
                sum+=a[j][k]-a[i-1][k];
                ans=max(ans,sum);
                if(sum<0) sum=0;
            }
        }
    }
    cout<<ans;
    return 0;
}

 


0
已采纳
陈正朔
陈正朔
初级光能
初级光能

核心

for(int i=1;i<=n;i++){
        for(int j=i;j<=n;j++){
            long long s=0;
            for(int k=1;k<=m;k++){
                s+=sum[j][k]-sum[i-1][k];
                ans=max(ans,s);
                if(s<0) s=0;
            }
        }
    }       

 

0
0
汪宇航
汪宇航
新手启示者
新手启示者

核心:

for(int j=1;j<=m;j++)

{

cin>>a[i][j];

if(a[i][j]==0)a[i][j]=-100000000;

s[i][j]=s[i][j-1]+a[i][j];

}

}

for(int i=1;i<=m;i++)

{

for(int j=i;j<=m;j++)

{

for(int k=1;k<=n;k++)

{

f1[i][j]=max(f1[i][j],0)+s[k][j]-s[k][i-1];

f[i][j]=max(f[i][j],f1[i][j]);

}

}

}

for(int i=1;i<=m;i++)

{

for(int j=1;j<=m;j++)

{

ans=max(ans,f[i][j]);

}

}

定义自己定义去

我要回答