巧克力解题报告
2013-07-17 18:06
169 查看
描述:布欧可以把人变成巧克力吃了来增加他的能量,也有可能减少。
现在布欧变了n*m 个巧克力,并把巧克力排成一个n*m 的矩形,现在布欧想选择一个子矩形,把这个子矩形吃了来增加他的能量,可他不知道选哪个才能使他的能量增加值p最大,布欧也可以选择一个都不吃,这样p = 0。现在布欧要你告诉他p 的最大值,不然他就先把你变成巧克力吃了!
输入输出要求:
Input
第一行:一个整数T 代表测试个数,
接着T 组测试数据。
对每组测试数据:
第一行:n m 两个整数
接着n 行每行m 个空格隔开的整数a(i,j)代表对应巧克力的能量值(注意可以是负数,吃了能量减少)
1<=n,m<=300
-1000<= a(i,j) <= 1000
Output
T 行
每行一个整数p
输入输出样例:
Sample Input
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
Sample Output
8
0
4
解题思路:这题其实就是求一个矩阵的最大子矩阵,但是真心不会求,于是百度了一下,看看有没有模板,果然找到了。要注意的是时间复杂度为O(n^4)的模板会爆掉,所以用时间复杂度为O(n^3)的模板。
代码:
#include <iostream>
using namespace std;
int vn[305][305];
int temp[305][305];
int main()
{
int n,m;
intT;
cin>>T;
while(T--)
{
cin>>n>>m;
inti,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>vn[i][j];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
temp[i][j]=0;
int sum,lsum,max=0;
if(n==1)
{
for(i=0;i<m;i++)
{
sum=0;
for(j=i;j<m;j++)
{
sum+=vn[0][j];
if(sum>max)
max=sum;
}
}
cout<<max<<endl;
}
else
{
for(inta=0;a<n;a++)
{
for(int b=0;b<n;b++)
{
sum=0;
for(intc=b;c<m;c++)
{
sum+=vn[a][c];
lsum=sum+temp[c];
if(lsum>max)
max=lsum;
if(lsum<0)
lsum=0;
temp[b][c]=lsum;
}
}
}
cout<<max<<endl;
}
}
return 0;
}
[b]解题感想:模板很强大,要多多理解,多多积累
现在布欧变了n*m 个巧克力,并把巧克力排成一个n*m 的矩形,现在布欧想选择一个子矩形,把这个子矩形吃了来增加他的能量,可他不知道选哪个才能使他的能量增加值p最大,布欧也可以选择一个都不吃,这样p = 0。现在布欧要你告诉他p 的最大值,不然他就先把你变成巧克力吃了!
输入输出要求:
Input
第一行:一个整数T 代表测试个数,
接着T 组测试数据。
对每组测试数据:
第一行:n m 两个整数
接着n 行每行m 个空格隔开的整数a(i,j)代表对应巧克力的能量值(注意可以是负数,吃了能量减少)
1<=n,m<=300
-1000<= a(i,j) <= 1000
Output
T 行
每行一个整数p
输入输出样例:
Sample Input
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
Sample Output
8
0
4
解题思路:这题其实就是求一个矩阵的最大子矩阵,但是真心不会求,于是百度了一下,看看有没有模板,果然找到了。要注意的是时间复杂度为O(n^4)的模板会爆掉,所以用时间复杂度为O(n^3)的模板。
代码:
#include <iostream>
using namespace std;
int vn[305][305];
int temp[305][305];
int main()
{
int n,m;
intT;
cin>>T;
while(T--)
{
cin>>n>>m;
inti,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>vn[i][j];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
temp[i][j]=0;
int sum,lsum,max=0;
if(n==1)
{
for(i=0;i<m;i++)
{
sum=0;
for(j=i;j<m;j++)
{
sum+=vn[0][j];
if(sum>max)
max=sum;
}
}
cout<<max<<endl;
}
else
{
for(inta=0;a<n;a++)
{
for(int b=0;b<n;b++)
{
sum=0;
for(intc=b;c<m;c++)
{
sum+=vn[a][c];
lsum=sum+temp[c];
if(lsum>max)
max=lsum;
if(lsum<0)
lsum=0;
temp[b][c]=lsum;
}
}
}
cout<<max<<endl;
}
}
return 0;
}
[b]解题感想:模板很强大,要多多理解,多多积累
相关文章推荐
- UVa 1099 分巧克力 ACM解题报告(状压dp)
- POJ-3592-Instantaneous Transference 解题报告
- 1087. All Roads Lead to Rome (30)解题报告
- (解题报告)HDU2007---平方和与立方和
- 【LeetCode】475. Heaters 解题报告
- 智力题解题报告No.11 医生和护士
- hdu1501-poj2192详细解题报告
- NOIP模拟赛-旅行者问题 解题报告
- 【LeetCode】278. First Bad Version 解题报告
- POJ 1068解题报告
- Noip 2014 提高组复赛 解题报告
- 20161023 NOIP 模拟赛 T2 解题报告
- [Leetcode] 273. Integer to English Words 解题报告
- [BestCoder Round #25 1002]Harry And Magic Box 解题报告
- LeetCode 137. Single Number II 解题报告
- [Leetcode] 278. First Bad Version 解题报告
- hdu2426解题报告
- HDU 2544 SPFA(SLF) 解题报告
- hdu1533解题报告
- POJ 1001 解题报告 高精度大整数乘法模版