1.题目
http://acm.hdu.edu.cn/showproblem.php?pid=1081
2.分析
最大矩形的经典问题,不过需要注意的是其中还有负数,所以初始化的时候要初始化为最小值,或者初始化为当全部都为负值仍然不会达到的值。
使用的决策:
在确定行之后,在列方向上按照最大字段和求解
行:1<=i<=j<=n
列:用数组b[]存储,然后在[i,j]上不断累积
3.复杂度
双重for循环需要O(M^2*N)的计算复杂度;空间复杂度为O(M*N);
4.涉及内容
算法:动态规划
5.感想
经典问题,需要反复揣摩和思考,争取做到见到题目就能想到用的方法和思路,已经拓展和优化思路等等。
6.代码
#include <iostream>
using namespace std;
int arr1081[101][101];
long b1081[101];
long MaxSum1081(long n,long *arr)
{
long max=-128*100*100,temp=0;
for(int i=1;i<=n;++i)
{
if(temp>0)
temp+=arr[i];
else
temp=arr[i];
max=temp>max?temp:max;
}
return max;
}
int main()
{
freopen("in.txt","r",stdin);
long N,temp,max;
while(cin>>N)
{
memset(arr1081,0,101*101*sizeof(int));
max=-128*100*100;
for(int j=1;j<=N;++j)
{
for(int k=1;k<=N;++k)
{
cin>>arr1081[j][k];
}
}
for(int j=1;j<=N;++j)
{
memset(b1081,0,101*sizeof(long));
for(int k=j;k<=N;++k)
{
for(int m=1;m<=N;++m)
{
b1081[m]+=arr1081[k][m];
}
temp=MaxSum1081(N,b1081);
max=max>temp?max:temp;
}
}
cout<<max<<endl;
}
return 0;
}
7.参考文献
《计算机算法设计与分析》P61