实验报告 动态规划 最大子矩阵和

 一.题目描述

给定一个n*n(0< n <=100)的矩阵,矩阵中的元素均为整数。请找到此矩阵的一个子矩阵,并且此子矩阵的各个元素的和最大,输出这个最大的值。、

二.思路描述

动态规划思想

和求数组中的最大字段和问题相似,都运用了动态规划,设计一个容器储存目前的已知计算结果。

三.源代码

  1. #include<iostream>
    using namespace std;
    int main()
    {
    	int  n;
    	cin>>n;
    	int num[n][n]={0};
    	int Max[n]={0};
    	int MMax[n]={0};
    	int M=0;
    	for(int i=0;i<n;i++)
    	{
    		for(int j=0;j<n;j++)
    		{
    			cin>>num[i][j];
    		}
    	}
    	for(int k=0;k<n;k++)
    	{
    		for(int i=k;i<n;i++)
    			{	
    				for(int j=0;j<n;j++)
    				{
    					Max[j]=num[i][j]+Max[j];//统计求和
    				}
    				for(int j=0;j<n;j++)
    				{ 
    					if(j==0)
    					{
    						if(Max[j]<0)
    						{
    							MMax[j]=0;
    						}
    						else 
    						{
    							MMax[j]=Max[j];
    						}
    					}
    					if(j>0)
    					{
    						if(MMax[j-1]+Max[j]>MMax[j])
    						{
    							MMax[j]=MMax[j-1]+Max[j];
    						}
    						
    					}
    					if(M<MMax[j])
    							{
    								M=MMax[j];//求出最大值
    							}
    				}//求出这一行的最大子段和
    				for(int j=0;j<n;j++)
    				{
    					MMax[j]=0;
    				}//将比较数组置零
    			}
    		for(int j=0;j<n;j++)
    		{
    			Max[j]=0;
    		}
    	}
    	cout<<M<<endl;
    		return 0;
    }

四.测试数据及运行结果

1.测试数据

 5

0  -2  -7   0  9
 9   2  -6   2  3
-4  1   -4   1  6
-1  8    0  -2  8
-2  2    8   9  1
 

5
8 -10  -2  -9  -6
-3   2   5   9  -3 
7   9  -5   3  -6 
-1   9   1  -5   7 
-7   9   3  -6   7 


2.结果

 

 五.遇到的问题及解决方法

在循环过程中,容器需要及时清零,

核心思想是

if(MMax[j-1]+Max[j]>MMax[j])
        {
             MMax[j]=MMax[j-1]+Max[j];
        }

比较后进行复制,简而言之就是舍去负值,注意容器的第一个需要额外说明,

if(j==0)
                    {
                        if(Max[j]<0)
                        {
                            MMax[j]=0;
                        }
                        else 
                        {
                            MMax[j]=Max[j];
                        }
                    }

 因为边界处不满足该条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值