作业2
一.思路
1.一维数组作业1已述
2.二维数组连续最大子矩阵的和,其实是建立在连续最大子数组的和基础上的。遇到二维的情况一般是转换为一维的解法,解法如下:
如果子矩阵从第i行开始,到第r行结束,从第j列开始到第t列结束,则列的选择是一维的问题,关键在于如何选择哪几个行。所以在行的问题上使用暴力搜索,可得以下算法,算法复杂度达到了O(nm^2):
public static int max2(int[][] a){int m = a.length;
int n = a[0].length;
int temp[] = new int[n];int max = 0;
int tempMax = 0;
for(int i=0; i<m; i++){//从第0行开始暴力搜索for(int k=0; k<n; k++)temp[k] = 0;for(int j=i; j<m; j++){for(int p=0; p<n; p++){temp[p] += a[j][p];}tempMax = max1(temp, 0);//利用已有的一维算法
max = max > tempMax ? max : tempMax;}}return max;
}
3.如果是连通的情况,暂时没有好的解法,以后补上4.如果是上下相连,只需将行的搜索扩大一点,使每一行开始的搜索次数都达到m,关键一步是:while(count < m){
if(j == m)
j = 0;//处理(此处省略)
j++;count++;}
5.如果是左右相连,只需将一维算法改进一下,使每一列开始的搜索次数都达到n,关键一步是:for(int k=0; k<m; k++){tempMax = max1(temp, k);max = max > tempMax ? max : tempMax;}6.如果是上下左右相连,将4和5的算法合并即可。
二.心得
1.动态规划的算法本质是什么?我现在只能想到的是将大问题分解成小问题,并能利用小问题的解。关键一点在于如何划分这个大问题。这个还须多做练习才能总结出新的认识。
2.所谓将算法复杂度降低就是用人脑代替计算机?先在人脑上抽象出一些数学模型,从而简化问题?比如这个问题一维数组的情况,如果纯粹暴力解的话,计算机会大量的计算;而如果我们先自己解的话(利用动态规划)就能让计算机减少许多重复的计算。
3.二维的情况一般转换成一维的情况来解。
三.效率分析
Personal Software Process Stages
时间百分比(%)
实际花费的时间 (分钟)
原来估计的时间 (分钟)
Planning 计划 1 10 10 · Estimate · 估计这个任务需要多少时间,把工作细化并大致排序
Development 开发 91 750 480 · Analysis · 需求分析 (包括学习新技术) 36 300 240 · Design Spec · 生成设计文档 3 30 30 · Design Review · 设计复审 (和同事审核设计文档) 4 30 30 · Coding Standard · 代码规范 (制定合适的规范) 1 10 20 · Design · 具体设计 29 240 60 · Coding · 具体编码 3 30 30 · Code Review · 代码复审 2 20 10 · Test · 测试(自我测试,修改代码,提交修改) 3 30 60 Reporting
总结报告
8 60 30 · Test Report · 测试报告 6 50 20 · Size Measurement · 计算工作量 1 5 5 · Postmortem & Improvement Plan · 事后总结, 并提出改进 1 5 5 Total 总计 100% 820 520
四.效果截图