zoukankan      html  css  js  c++  java
  • 返回一个二维整数数组中最大子数组的和

    题目:返回一个二维整数数组中最大子数组的和。
    要求:
    输入一个二维整形数组,数组里有正数也有负数。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。

     思路:参考上一次的编程,求的是一维数组中,子数组和的最大值。这次是二维数组,如果将二维数组看作一维数组来解决的话,问题就行的通了。于是,首先要解决的是如何把二维数组当作一维来思考。分析:当最大子数组是一行的话,就直接是上一次的问题,用动态规划即可求出最大子数组的和。若最大子数组是两行时,这时就需要考虑是这两行中的连续的那几列构成的数组之和最大。这时,先把同一列上的元素相加成为一个一维数组,在用动态规划来求出行上最大值数组之和。同理,若最大子数组是三行、四行...n行时,问题就可以解决了。假设输入的是n*m的数组,则时间复杂度为(m*n^2).

    实现代码如下:

    //返回一个二位数组中最大子数组的和   2016/4/6 
    #include<iostream>
    using namespace std;
    int dp(int array[],int i)
    {
    	int dp[100][2],j,S;
    	dp[0][0]=array[0];
        dp[0][1]=array[0];
        for(j=1;j<i;j++)
        {
            dp[j][0]=max(dp[j-1][0],dp[j-1][1]);
            
            dp[j][1]=max(array[j],(dp[j-1][1]+array[j]));
        }
        S=max(dp[i-1][0],dp[i-1][1]);
        return S;
    }
    int main(){
    	int Array[100][100],len,wid;
    	cin>>len>>wid;
    	for(int i=0;i<wid;i++)
    	{
    		for(int j=0;j<len;j++)
    		{
    			cin>>Array[i][j];
    		}
    	}
    	int Max[wid],MAX=0;
    	for(int i=0;i<wid;i++)
    	{
    		int temp_Array[len];
    		for(int ii=0;ii<len;ii++){
    		temp_Array[ii]=Array[i][ii];
    		}
    		Max[i]=dp(temp_Array,len);
    		if(i<len-1)
    		{
    			for(int count=i+1;count<wid;count++)
    			{
    				for(int j=0;j<len;j++)
    				{
    					temp_Array[j]=temp_Array[j]+Array[count][j];
    				}
    				int temp_max=dp(temp_Array,len);
    				Max[i]=max(Max[i],temp_max);
    			}
    		} 
    		MAX=max(MAX,Max[i]);
    	}
    	cout<<MAX;
    	return 0;
    } 
    

    运行截图:

    总结:一个问题,当有了思路,就成功了一半。有了方向,只管往前走,就可以做到。

  • 相关阅读:
    excel套模板
    随便写写
    Ajax请求本页
    解除默认asp.net 上传文件大小的限制
    客户端获取mac ip 主机名
    获取客户端Mac
    vue中使用swiper出现Can't resolve 'swiper/dist/css/swiper.css'
    win10 输入法小技巧
    VS Code 编辑器配置备份
    axios报错: Cannot read property 'protocol' of undefined ....
  • 原文地址:https://www.cnblogs.com/wsqJohn/p/5360678.html
Copyright © 2011-2022 走看看