您的位置:首页 > 其它

HDU 1081 To The Max

2012-10-22 01:23 246 查看
/*
这题暴力的话时间复杂度太高。
本题是一维最大连续子序列的拓展。
求二维的话只要转化为一维就可以了。
转化方式。将一列的数字通过n^2的时间复杂度归并成一个数,
每次归并一次就遍历一下list求最大值(这步就是执行一维的最大连续子序列)。
*/
#include <iostream>
#include <string.h>
#include <cmath>
using namespace std;
int list[150];
int gird[150][150];
void get(int a,int b,int n)   //获得list列表。
{
int i,j;
memset(list,0,sizeof(list));
for(j=1;j<=n;++j)
{
for(i=a;i<=b;++i)
{
list[j]+=gird[i][j];
}
}
return;
}
int find(int n)
{
int i,j,k;
int res=0;
for(i=0;i<n;++i)
{
for(j=0;j<=i;++j)
{
get(j,i,n);
//已经获得list列表,现在进行一维的最大连续子序列。
for(k=1;k<=n;++k)
{
list[k]=max(list[k-1],0)+list[k];
if(list[k]>res) res=list[k];
}

}
}
return res;
}
int main()
{
int n,i,j;
while(cin>>n)
{
for(i=0;i<n;++i)
for(j=1;j<=n;++j)
{
cin>>gird[i][j];
}
cout<<find(n)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: