易语言使用最大不下降序列算法解决航线设置
问题描述:
美丽的莱茵河畔,每边都分布着5个城市,两边的城市都是唯一对应的友好城市,现需要在友好城市开通航线以加强往来.
但因为莱茵河常年大雾,如果开设的航线发生交叉现象就有可能出现碰船的现象.现在要求近可能多地开通航线并且使航线不能相交!
求出最多能开通的航线数和城市?
问题分析:
用一个数组来存放对应的友好城市的代码和友好城市的对数,然后在规划时先从倒数第二个城市开始,找出可以设置的航线条数和下一条航线开始的城市,如果正在规划的城市的航线数大于已知的航线条数,则存储这个航线条数和城市的代码,这样一直找下去,把最多的航线数都找出来,最后把最多的航线数和对应的友好城市显示出来。
此问题可以演化成求最大不下降序列来完成
程序集变量
这里友好城市数组采用了二维数组。
.版本 2 .程序集 启动窗口程序集 .程序集变量 友好城市数组, 整数型, , "5,4", 存放所有友好城市代码 .程序集变量 友好城市对数, 整数型, , , 存放所有友好城市对数 .程序集变量 最大航线条数, 整数型, , , 存放最大的航线条数
计算执行
.版本 2 .子程序 _计算图形按钮_被单击 .局部变量 循环变量1, 整数型 .局部变量 循环变量2, 整数型 .局部变量 本城市航线条数, 整数型, , , 存放当前城市的般线条数 .局部变量 下条航线城市, 整数型, , , 存放当前城市的下条般线到达的城市代码 .局部变量 城市代码, 整数型, , , 存放城市代码 ' 将程序集变量置0 最大航线条数 = 0 友好城市对数 = 0 .变量循环首 (1, 5, 1, 循环变量1) 友好城市数组 [循环变量1] [1] = 0 友好城市数组 [循环变量1] [2] = 0 友好城市数组 [循环变量1] [3] = 0 友好城市数组 [循环变量1] [4] = 0 .变量循环尾 () ' 以下为初始化代码 ' 设置友好城市对数为5 友好城市对数 = 5 ' 将最大航线条数置0 最大航线条数 = 0 ' 设置友好城市代码 .变量循环首 (1, 取数组下标 (友好城市数组, ), 1, 循环变量1) ' 设置两个对应友好城市的代码 友好城市数组 [循环变量1] [1] = 循环变量1 × 2 友好城市数组 [循环变量1] [2] = 循环变量1 × 2 + 1 ' 表示可以设置的航线条数 友好城市数组 [循环变量1] [3] = 1 ' 表示后继,即下一条航线从哪里开始设置,为0表示不能设置下一条航线 友好城市数组 [循环变量1] [4] = 0 .变量循环尾 () ' 从倒数第二个城市开始规划 .变量循环首 (友好城市对数 - 1, 1, -1, 循环变量1) ' “本城市航线条数”表示本城市后面可以设置的航线数,“下条航线城市”表示下条航线从哪个城市开始 本城市航线条数 = 0 下条航线城市 = 0 .变量循环首 (循环变量1 + 1, 友好城市对数, 1, 循环变量2) ' 如果本城市“循环变量1”的终点小于后面城市的终点(即不相交),并且此城市后面可以设置的航线数大于“本城市航线条数” .如果真 (友好城市数组 [循环变量1] [2] > 本城市航线条数) ' 如果上面条件成立,那么“本城市航线条数”等于城市“循环变量2”的可以设置航线数 本城市航线条数 = 友好城市数组 [循环变量2] [3] ' 如果上面条件成立,“下条航线城市”等于可以设置下条航线的城市代码 下条航线城市 = 循环变量2 ' 如果本城市后面总共可以设置的航线数>0 .如果真结束 .如果真 (本城市航线条数 > 0) ' 如果本城市后面总共可以设置的航线数>0,则本城市可以设置的航线数在下个城市可以设置航线数的基础上加1 友好城市数组 [循环变量2] [3] = 本城市航线条数 + 1 ' 如果本城市后面总共可以设置的航线数>0,则“友好城市[循环变量2][4]”等于本城市后续城市的代码 友好城市数组 [循环变量2] [4] = 下条航线城市 .如果真结束 .变量循环尾 () .变量循环尾 () ' “最大航线条数”为可以设置最大航线数,假设初值为第一个城市可以设置的航线数 最大航线条数 = 友好城市数组 [1] [3] ' “城市代码”为城市代码,初值为第一个城市 城市代码 = 1 ' 找出可以设置航线的最大值,赋值给“最大航线条数”,同时“城市代码”记下哪个可以设置最大航线数的城市代码 .变量循环首 (2, 友好城市对数, 1, 循环变量1) .如果真 (友好城市数组 [循环变量1] [3] > 最大航线条数) 最大航线条数 = 友好城市数组 [循环变量1] [3] 城市代码 = 循环变量1 .如果真结束 .变量循环尾 () ' 显示结果,因为有可能有多种方案,所以只要哪个城市可以设置的航线数等于最大值“最大航线条数”就显示结果 .变量循环首 (1, 友好城市对数, 1, 循环变量2) .如果真 (友好城市数组 [循环变量2] [3] = 最大航线条数) 显示结果 (循环变量2) .如果真结束 .变量循环尾 ()
显示结果
.版本 2 .子程序 显示结果, , , 将结果显示出来 .参数 城市值, 整数型 显示结果画板.滚动写行 (“最多可设置的航线数是: ” + 到文本 (最大航线条数)) .循环判断首 () ' 输出可以设置航线的友好城市代码 显示结果画板.滚动写行 (“友好城市代码: ” + 到文本 (友好城市数组 [城市值] [1]) + “,” + 到文本 (友好城市数组 [城市值] [2])) 城市值 = 友好城市数组 [城市值] [4] .循环判断尾 (城市值 = 0)