第三章作业

题目详情:

3-3 挖地雷 (25分)

在一个地图上有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

1.1列出递归方程式:

以m[i]表示自第i个位置起能挖到的最多地雷数

以a[i]表示第i个位置的地雷数

则递归方程式为:m[i]=max{m[j]+a[i]}

其中i<j<=n,且i到j有通路。

1.2 给出填表法中表的维度、填表范围和填表顺序

①以m[i]表示自第i个位置起能挖到的最多地雷数,则所要填表为一维的表

②填表范围为1到n

③因为i<j,所以所要填的表的当前位置依赖于更后位置的子问题的解,所以该表,应从后往前填。

④填表的边界,当 i = n时,m[n] = a[n]。

1.3 分析该算法的时间和空间复杂度

时间复杂度:计算从 i 到 n 挖到最多的地雷数里,i 的取值是从1到n,而 j 的取值是从 (i+1) 到n。因此时间复杂度为O(n²) 。

空间复杂度:由于需要存储 “地窖i 到 地窖j 是否存在通路”的情况,在本题中我用了二维数组在存储该信息,因此空间复杂度为O(n²)。

2. 你对动态规划算法的理解

动态规划算法的两个基本要素:

①最优子结构性质决定了算法的正确性

②重叠子问题性质影响了算法的有效性

动态规划,其中“如何拆分子问题,分析出最优子结构性质,进而列出递归方程式”这一步是最关键的。接下来根据递归方程式就可以分析出填表法中表的维度、填表范围和填表顺序等。另外,表的边界也需要特别考虑,边界可能要附上初始值。

3. 说明结对编程情况

一开始接触动态规划算法,对我们来说,是陌生而充满挑战的,未曾见过的复杂题目让我们头昏眼花,但在掌握基本方法后,这样的题目却也可以抽丝剥茧,一步步的解出答案,中途可能遇到一些疏漏的小问题也能在经过调试后解决。

posted @ 2020-10-31 23:31  楠木阁子  阅读(126)  评论(0编辑  收藏  举报