主题:高手请进,请教动态规划
芊芊文竹
[专家分:0] 发布于 2011-07-20 19:16:00
哪位高手教我动态规划,我在网上搜,全是pascl或c++
回复列表 (共3个回复)
沙发
moz [专家分:37620] 发布于 2011-07-20 21:44:00
我不知道什么叫动态规划,
但记得曾经有一贴叫深搜,
其实我也没学懂。
[url]http://bbs.pfan.cn/post-48214.html[/url]
板凳
幽灵密码 [专家分:3510] 发布于 2011-07-21 08:32:00
动态规划是求最优解的时候常用的方法,比如有一题,从三角形的顶部出发,只能像正下和右下方走,要求经过的数字和最大。
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 楼
幽灵密码 [专家分:3510] 发布于 2011-07-21 08:36:00
你要是真的已经学到了动态规划,我建议你不要再学Qbasic了,Qbasic寿命不长,初中竞赛就不能用了,还是用Pascal或者C++吧
我来回复