您的位置:首页 > 其它

nyoj44求最大和 最大矩阵和问题

2012-07-10 15:22 190 查看
简单矩阵dp问题。。。可以把多维矩阵化为一维求最大和。。。。。

简单来说就是可以把第一行和第二行相加。。。然后求最大和,,,第一第二第三相加求最大和等等。。。。然后再从第二行开始,吧第二行第三行相加求最大值,,,

第二第三第四相加的最大和。。。。等等等。。。依此类推。。。。。。。

题目如下。。。。

描述

给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。

例子:

0 -2 -7 0

9
2 -6 2

-4
1 -4 1

-1 8 0 -2

其最大子矩阵为:

9
2

-4
1

-1
8

其元素总和为15。

输入第一行输入一个整数n(0<n<=100),表示有n组测试数据;

每组测试数据:

第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;

随后有r行,每行有c个整数;

输出输出矩阵的最大子矩阵的元素之和。
样例输入
1
4 4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2


样例输出
15


代码:::

}#include<stdio.h>

int str[100][100];

int st[100];

int max1(int st[],int d)

{

int sum=0,x,max=-33333;

for(x=0;x<d;x++)

{

if(sum>0)

sum+=st[x];

else

sum=st[x];

if(sum>max)

max=sum;

}

return max;

}

int main()

{

int a,i,j,c,d;

scanf("%d",&a);

while(a--)

{

scanf("%d%d",&c,&d);

for(i=0;i<c;i++)

for(j=0;j<d;j++)

scanf("%d",&str[i][j]);

int sum=0,m,n,k,max=-3333,ma;

for(i=0;i<c;i++)

{

for(k=0;k<d;k++)

st[k]=0;

for(j=i;j<c;j++)

{

for(k=0;k<d;k++)

st[k]+=str[j][k];

ma=max1(st,d);

if(ma>max)

max=ma;

}

}

printf("%d\n",max);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐