|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
先看题目
首先声明,本人对算法一窍不通。
本来想下载大佬的解法看看,但帖子里的附件一个也下载不了,不知怎么回事。
帖子里版主说要用动态规划法求解,于是搜了一下,
然后照着写了一个:
- Sub 捡金币_main()
- Range("a1:j10").Interior.ColorIndex = 0
- Range("a1:j10").Font.ColorIndex = 0
- arr = Range("a1:j10")
- Range("o7:o10") = ""
- Call 去程(arr)
- Call 回程(arr)
- End Sub
- Sub 去程(ByVal ar)
- ReDim br(1 To 10, 1 To 10) '存放累加值
- ReDim cr(1 To 10, 1 To 10) '存放路径
- ar(1, 1) = 0: ar(10, 10) = 0: cr(1, 1) = "A1" '初始值
- '第一列逐个累加
- For i = 2 To 10
- br(i, 1) = br(i - 1, 1) + ar(i, 1)
- cr(i, 1) = cr(i - 1, 1) & "->" & Cells(i, 1).Address(0, 0)
- Next
-
- '第一行逐个累加
- For j = 2 To 10
- br(1, j) = br(1, j - 1) + ar(1, j)
- cr(1, j) = cr(1, j - 1) & "->" & Cells(1, j).Address(0, 0)
- Next
- 'br从第二行第二列开始循环,比较当前格的上一格和左一格的大小,(上,左都是累加值)
- '取较大的值+ar的当前值=br当前值
- For i = 2 To 10
- For j = 2 To 10
- If br(i - 1, j) > br(i, j - 1) Then
- br(i, j) = br(i - 1, j) + ar(i, j)
- cr(i, j) = cr(i - 1, j) & "->" & Cells(i, j).Address(0, 0)
- Else
- br(i, j) = br(i, j - 1) + ar(i, j)
- cr(i, j) = cr(i, j - 1) & "->" & Cells(i, j).Address(0, 0)
- End If
- Next
- Next
- 'br(10,10)即为最大值
- [o7] = "去程捡到" & br(10, 10) & "金币"
- [o8] = "去程路径:" & cr(10, 10)
- '着色
- t = Split(cr(10, 10), "->")
- For Each cel In t
- Range(cel).Font.ColorIndex = 3
- Next
- End Sub
- Sub 回程(ByVal ar)
- ReDim br(1 To 10, 1 To 10) '存放累加值
- ReDim cr(1 To 10, 1 To 10) '存放路径
- ar(1, 1) = 0: ar(10, 10) = 0
- cr(10, 10) = "J10"
-
- For i = 9 To 1 Step -1
- br(i, 10) = br(i + 1, 10) + ar(i, 10)
- cr(i, 10) = cr(i + 1, 10) & "->" & Cells(i, 10).Address(0, 0)
- Next
-
- For j = 9 To 1 Step -1
- br(10, j) = br(10, j + 1) + ar(10, j)
- cr(10, j) = cr(10, j + 1) & "->" & Cells(10, j).Address(0, 0)
- Next
- For i = 9 To 1 Step -1
- For j = 9 To 1 Step -1
- If br(i + 1, j) > br(i, j + 1) Then
- br(i, j) = br(i + 1, j) + ar(i, j)
- cr(i, j) = cr(i + 1, j) & "->" & Cells(i, j).Address(0, 0)
- Else
- br(i, j) = br(i, j + 1) + ar(i, j)
- cr(i, j) = cr(i, j + 1) & "->" & Cells(i, j).Address(0, 0)
- End If
- Next
- Next
- [o9] = "回程捡到" & br(1, 1) & "金币"
- [o10] = "回程路径:" & cr(1, 1)
- t = Split(cr(1, 1), "->")
- For Each cel In t
- Range(cel).Interior.ColorIndex = 34
- Next
- End Sub
复制代码
回程其实就是把数组倒过来循环,也不知版主说的”双线动态规划“是怎么样。
另外,没发现来回捡到金币数不一样的情况,有时路径不一样,但捡到金币数是一样的。
本人的算法对不对?
金币数不一样是什么情况?请各位大佬赐教。
捡金币2.zip
(69.94 KB, 下载次数: 11)
|
|