回 帖 发 新 帖 刷新版面

主题:高手请进,请教动态规划

哪位高手教我动态规划,我在网上搜,全是pascl或c++

回复列表 (共3个回复)

沙发

我不知道什么叫动态规划,
但记得曾经有一贴叫深搜,
其实我也没学懂。

[url]http://bbs.pfan.cn/post-48214.html[/url]

板凳

动态规划是求最优解的时候常用的方法,比如有一题,从三角形的顶部出发,只能像正下和右下方走,要求经过的数字和最大。
5(5行)
7
3,8
8,1,0
2,7,4,4
4,5,2,6,5
输出:30
输出说明:7+3+8+7+5=30
普通的贪心算法就是每次比较正下和右下方数字的大小,可是这样算出来是7+8+1+7+5=28,不是最优的解
用动态规划从底部向上搜,把每一个坐标位置的最大数字和都记下来,初始状态下从最底行最大的数分别是4,5,2,6,5,向上搜第四行最大的数就分别是:
max{4,5}+2=7
max{5,2}+7=12
max{2,6}+4=10
max{6,5}+4=10
接下来第三行便是:
max{7,12}+8=20
max{12,10}+1=13
max{10,10}+0=10
倒退到第二行:
max{20,13}+3=23
max{13,10}+8=21
最后到顶部的7:
最大数=max{23,21}+7=30

与贪心算法不同的有两点,一是用倒推的方法,二是不用数字本身计算,而用当前位置的最大和计算。程序如下:


CLS
INPUT n
DIM a(n, n)
FOR i = 1 TO n
  FOR j = 1 TO i
    INPUT a(i, j)
NEXT j, i
FOR i = n - 1 TO 1 STEP -1
  FOR j = 1 TO i
    IF a(i + 1, j) > a(i + 1, j + 1) THEN '把当前数字变成当前位置的最大数字和
      a(i, j) = a(i, j) + a(i + 1, j)
    ELSE
      a(i, j) = a(i, j) + a(i + 1, j + 1)
    END IF
NEXT j, i
PRINT a(1, 1)
END
大概就是这样

还有Moz给的那个帖子,那就是回溯,只不过用递归的方法来做而已,排列和组合是最基本的回溯,在书本上说的回溯是用模拟栈和Do While循环来做的,用递归电脑会自己做栈,所以更加方便

3 楼

你要是真的已经学到了动态规划,我建议你不要再学Qbasic了,Qbasic寿命不长,初中竞赛就不能用了,还是用Pascal或者C++吧

我来回复

您尚未登录,请登录后再回复。点此登录或注册