算法题2 动态规划之最大子序列和&最大子矩阵和
2016-01-27 14:05
405 查看
题目
有整数数组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)
代码
题目
分析
对于最大子矩阵和sum来说,是子矩阵所有元素相加的和,即可以先同一列上的元素相加,多行降维成一行,进而可以转化为求最大子序列和的问题。循环对矩阵不同行的组合进行降维求最大子序列和,进而求出和最大的那个行组合,即可得到最大子矩阵和。
算法时间复杂度O(n*n*m)
代码
有整数数组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; }
相关文章推荐
- HDU 1033 Edge
- MSSQL STUFF
- 广州易幻网络科技有限公司Android笔面经 (未通过)
- 配置xheditor图片上传功能
- SpringMVC 和 Struts2 框架区别
- Unity5.3.1f1 Network 局域网实时联网demo
- HttpClient和HttpURLConnection的区别
- 关于python使用MySQLdb新增操作
- 前端工程师使用node.js打造日记社区教程之一
- Android学习----自适应国际化语言
- web移动端常见问题总结
- wdatepicker,自定义时间限制
- DrawableView
- 链表的理解与实现[数据结构]
- mongodb-sharding 分片
- mac配置Android 环境,完整过程,其中包括遇到的设置$JAVA_HOME问题,新建项目报 Errors running builder 'Android Resource Manager问题
- iOS开发多线程篇—GCD的常见用法
- RHEL 6.0 FTP服务器配置菜鸟配置过程记录
- bzoj4196 软件包管理器
- 透明加密SDK --系统升级