您的位置:首页 > 其它

ZOJ 1074 To the Max(DP)

2013-04-16 21:53 274 查看
题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1074

这道题的dP是基于 “最大子段和” 的dp方法

例如求数组 1 2 -3 4;-5 6 -1 8 的最大子矩阵和,可以把两行相加得到数组-4 8 -4 12,对这个数组求最大子段和为8+-4+12=16,所以矩阵对应的最大子矩阵为2 -3 4; 6 -1 8

那么可以利用以上思想,对于m*n的矩阵A,选取他的第 i 行到第 j 行的数据组成子矩阵Aij (j-i+1行n列),Aij 对应的最大子段和可以如下求得:对每一列的值进行累加得到一个一维数组(1*n),对该数组求最大字段和( 其中 1=< i=<j<=m )。

综上所述,A的最大子矩阵和为:max( subMatrix(Aij) ) ,其中1=< i=<j<=m ,subSegment(Aij) 表示Aij 对应的最大子段和。

上代码:

#include<iostream>
#include <cstring>
using namespace std;

int maxSubSegment(int *arr,int n)
{
int max=-65535,sum=0;
for(int i=1;i<=n;i++)
{
if(sum>0)sum+=arr[i];
else sum=arr[i];
if(max<sum)max=sum;
}
return max;
}

int matrix[101][101];
int sum[101];
int main()
{
int N;
cin>>N;

for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
{
cin>>matrix[i][j];
}
//////////////////////////Dp;
int result=-65535;
for(int i=1;i<=N;i++)
{
memset(sum,0,sizeof(sum));
for(int j=i;j<=N;j++)
{
for(int k=1;k<=N;k++)
sum[k]+=matrix[j][k];
int re=maxSubSegment(sum,N);
if(result<re)
result=re;
}
}
cout<<result;
return 0;
}


【版权声明】转载请注明出处 /article/4879596.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: