巧克力
时间限制:
4000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
布欧可以把人变成巧克力吃了来增加他的能量,也有可能减少。
现在布欧变了n*m个巧克力,并把巧克力排成一个n*m的矩形,现在布欧想选择一个子矩形,把这个子矩形吃了来增加他的能量,可他不知道选哪个才能使他的能量增加值p最大,布欧也可以选择一个都不吃,这样p = 0。
现在布欧要你告诉他p的最大值,不然他就先把你变成巧克力吃了!
-
输入
-
第一行:一个整数T 代表测试个数,
接着T组测试数据。
对每组测试数据:
第一行:n m 两个整数
接着n行每行m个空格隔开的整数a(i,j)代表对应巧克力的能量值(注意可以是负数,吃了能量减少)
1<=n,m<=300
-1000<= a(i,j) <= 1000
输出
-
T行
每行一个整数 p
样例输入
-
3 3 3 1 -1 4 2 -2 3 3 -10 1 3 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 3 1 1 -10 -1 1 -10 1 1 -10
样例输出
-
8 0 4
提示
-
请使用scanf输入。
第一组数据吃
4
3
1
第二组数据一个也不吃
第三组数据吃
1 1
-1 1
1 1
-
第一行:一个整数T 代表测试个数,
刚发现前几天贴代码没成功.........今天补上.......
也是刚发现,原来这个题暴力也是完全可以的,之前看的别人的代码,不懂,现在看着,也不是那种非常膜拜的感觉了,毕竟学习是要靠自己的,有时候别人的方法虽然能解决问题,但是并不一定是自己适合的方法,而且更不一定是最优的方法......突发奇想,随便扯扯.........
#include<stdio.h>
int x[305][305];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
int a;
scanf("%d",&a);
x[i][j]=x[i-1][j]+a;//这一步有人说叫:矩阵压缩
}
}
int maxn=0;
for(int i=1;i<=n;++i)
{
for(int j=i;j<=n;++j)//双循环枚举所有的组合
{
int tp=0,sum=0;
for(int k=1;k<=m;++k)//这里面的一层是求最大字串和的
{
tp+=x[j][k]-x[i-1][k];
if(tp>sum)
{
sum=tp;
}
if(tp<0)
{
tp=0;
}
}
if(sum>maxn)
{
maxn=sum;
}
}
}
printf("%d\n",maxn);
}
return 0;
}