zoukankan      html  css  js  c++  java
  • 算法题2 动态规划之最大子序列和&最大子矩阵和

    题目

    有整数数组int a[]={-1,2,-3,10,-4,7,2,5},找出此数组的一个连续子序列,使得该子序列的和最大。可以得到子序列{10,-4,7,2,5}的和20最大,输出该子序列

    分析

    设sum[i]为0到i元素数组的最大子序列和,那么sum[i-1]是它的子问题解,可以利用动态规划求解。有关系式

    sum[0]=a[0];

    sum[i]=a[j],当sum[i-1]<0;

    sum[i]=sum[i-1]+a[j],当sum[i-1]>=0;

    算法复杂度为O(n),空间复杂度O(1)

    代码

    int MaxSubSumOfArray(int arr[],int len,int& sub_s,int& sub_e)
    {
    	if (arr==NULL||len<=0)
    	{
    		throw std::exception("Invalid input.");
    	}
    
    	int sum=arr[0];
    	int max=sum;
    	int sidx=0,eidx=0;
    	for(int i=1;i<len;i++)
    	{
    		if(sum<0)
    		{
    			sum=arr[i];
    			sidx=i;
    			eidx=i;
    		}else
    		{
    			sum=sum+arr[i];
    			eidx++;
    		}
    		//max=(max>sum)?max:sum;
    		if (max<=sum)
    		{
    			max=sum;
    			sub_s=sidx;
    			sub_e=eidx;
    		}
    
    	}
    	return max;
    }
    

      

    题目

    现有矩阵:

    0, -2, -7, 0, 3

    9, 2, -6, 2, 5

    -4, 1, -4, 1, 6

    -1, 8, 0, -2, 2

    求该矩阵的一个子矩阵,使子矩阵所有元素的和最大

    分析

    对于最大子矩阵和sum来说,是子矩阵所有元素相加的和,即可以先同一列上的元素相加,多行降维成一行,进而可以转化为求最大子序列和的问题。循环对矩阵不同行的组合进行降维求最大子序列和,进而求出和最大的那个行组合,即可得到最大子矩阵和。

    算法时间复杂度O(n*n*m)

    代码

    int MaxSumOfMatrix(int **matrix,int row_len,int column_len)
    {
    	if (matrix==NULL||row_len<=0||column_len<=0)
    	{
    		throw std::exception("Invalid input.");
    		return -1;
    	}
    
    	int max=0;
    
    	//申请二维数组空间
    	int **sumMatrix=new int*[row_len];
    	for (int i=0;i<row_len;i++)
    	{
    		sumMatrix[i]=new int[column_len]();
    	}
    
    	//依次求0到i列累加和
    	for (int row=0;row<row_len;row++)
    	{
    		for (int col=0;col<column_len;col++)
    		{
    			if (row==0)
    			{
    				sumMatrix[row][col]=matrix[row][col];
    			}else
    			{
    			    sumMatrix[row][col]=sumMatrix[row-1][col]+matrix[row][col];
    			}
    			
    		}
    	}
    
    	int* tmp_arr=new int[column_len]();
    	for (int row=0;row<row_len;row++)
    	{
    		for (int rowx=row;rowx<row_len;rowx++)
    		{
    			for (int col=0;col<column_len;col++)
    			{
    				if (row>0)
    				{
    					tmp_arr[col]=sumMatrix[rowx][col]-sumMatrix[row-1][col];
    				}else
    				{
    					tmp_arr[col]=sumMatrix[rowx][col];
    				}
    			}																									   
    
    			int col_s=0,col_e=0;
    			int re=MaxSumOfArray2(tmp_arr,column_len,col_s,col_e);
    			max=(max>re)?max:re;
    		}
    	}
    
    	//释放
    	for (int i=0;i<row_len;i++)
    	{
    		delete[] sumMatrix[i];
    	}
    	delete[] sumMatrix;
    	
    	delete[] tmp_arr;
    
    	return max;
    }

     

  • 相关阅读:
    第1条:考虑用静态工厂方法代替构造器
    代理模式(Proxy Pattern)
    out 和 ref 参数修饰符
    SQL Server 性能调优(一)——从等待状态判断系统资源瓶颈【转】
    Windows下获取Dump文件以及进程下各线程调用栈的方法总结(转)
    sql server内置函数
    ORA-16019 和 ORA-16018 错误的处理方法(转)
    marge into操作
    LogMiner配置使用手册
    课后作业
  • 原文地址:https://www.cnblogs.com/wangzaizhen/p/5163055.html
Copyright © 2011-2022 走看看