算法第三章作业
“挖地雷”算法分析
题目
在一个地图上有n个地窖(n≤200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,且保证都是小序号地窖指向大序号地窖,也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径。某人可以从任意一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。
输入格式:
第一行:地窖的个数;
第二行:为依次每个地窖地雷的个数;
下面若干行:
xi yi //表示从xi可到yi,xi<yi。
最后一行为"0 0"表示结束。
输出格式:
k1-k2−…−kv //挖地雷的顺序 挖到最多的雷。
输入样例:
6
5 10 20 5 4 5
1 2
1 4
2 4
3 4
4 5
4 6
5 6
0 0
输出样例:
3-4-5-6 34
解题思路
从动态规划角度来说,我的解题思路是这样的:先用一个max[i]数组来记录一下从i出发能够挖到的最多的地雷数目,然后从i点出发,用数组ach[i][j]判断从i点能否到达j点,num[i]表示i点地雷的数量。
动态规划的方程式:

在使用填表法时,需要一个一维的矩阵,n代表的是地窖的个数。当我们进行填表的时候,我们需要从左往右进行填充表格。从i点出发,不断累积所挖的地雷数量,这样才能计算出从每个不同的点出发所挖得的地雷最大数量。
算法的时间和空间复杂度
时间复杂度O(n2)
空间复杂度O(n)
动态规划算法的理解
动态规划是将一个问题转换成一个个小问题,这其实很多问题都可以这样子化简来做,但是动态规划的核心要点是判断这些小问题会不会被重复调用。以此来减少计算量才算的上是真正的动态规划。
说明结对编程情况
目前来说我和梁广儒的结对编程比较顺利,虽然说理解上存在一点小小的问题,但是总体来说的话我们两个之间沟通和配合还是良好的。

浙公网安备 33010602011771号