中级启示者
题目描述 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;
}
初级光能
核心
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;
}
}
}
初级光能
新手启示者
核心:
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]);
}
}
定义自己定义去