动态规划 - 建中首页.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态规划 - 建中首页

Dynamic Programming 方法概述 在Divide and Conquer的時候,如果一次會分成數個子問題,很容易就會要重複計算一些子問題,這樣非常浪費時間。所以我們建一張表,把所有子問題的答案存下來,下次再碰到時,就可以直接用。這是由上而下的做法。 我們也可以倒過來,由下往上做,就是先把可能遇到的子問題都處理好,再一步一步推回原本的問題。 用Dynamic Programming,最重要的是「DP元素」和「遞迴式」。「DP元素」就是表格上每一格存的東西所代表的意義;「遞迴式」就是用子問題答案建構出原問題答案的方法。通常決定了這兩樣東西,就可以很容易的寫出程式。而這兩樣東西的好壞,會決定這個演算法的好壞。 如果題目不只求最佳解的值是多少,還要問「如何解」,那多半需要把DP過程中所做的選擇記錄下來,然後從最後面trace-back回去。 題1 生產線 現在有兩條生產線,每條線有n個工作站,第a條線上的第b個站需要Aa,b的時間。每一個貨物都要依序經過n個工作站(無論在哪條線上),才能出廠。從工作站W1,x到W1,x+1不需要花時間,但是從W1,x到W2,x+1需要T1,x的時間;同樣的,從W2,x到W1,x+1需要T2,x的時間。進入生產線和從生產線送出分別需要E1、E2、X1、X2的時間。 給定這些時間,若想以最快的方式生產一件產品,要經過哪些工作站? DP元素:Time[a, b] 表示 第a條生產線第b個站到出口所需的最短時間 遞迴式:Time[a, b] = min{ Time[a, b+1], Time[3-a, b+1] + Ta,b } 題2 Longest Common Subsequence(最長共同子序列) 定義:字串p為字串s的subsequence 若且唯若 p的每個字元都按照順序出現在s中。(不一定要連續,連續的又稱為substring)例如字串”abc”的subsequence有 “”、“a”、“b”、“c”、“ab”、“bc”、“ac”、“abc”。 現在給定兩字串s、t,求一字串p,滿足p同時為s及t的subsequence,且p的長度最長,此時稱p為s與t的LCS。 例:”bronze” 和 ”crown” 的LCS為 ”ron”。 DP元素:len[a, b] 表示 s[1..a] 和t[1..b] 的LCS長度 遞迴式:len[a, b] = max{ len[a-1, b] , len[a, b-1] , len[a-1, b-1] + (s[a] == t[b]) } 變化:如果要求3個字串以上的LCS呢? 題3 Longest Incresing Subsequence (最長遞增子序列) 給定一數列,求此數列的一個最長的子序列,且該子序列嚴格遞增。這有很多種方法,有O(n2) 的,也有O(n lgn) 的。另外,也可以利用LCS來求LIS。 例:{5, 2, 8, 7, 3, 1, 6, 4} 的LIS為 {2, 3, 4} 或 {2,3, 6}。 DP元素:len[a] 表示 結束在a的LIS長度 遞迴式:len[a] = max{ len[b] | b a s[b] s[a] } + 1 題4 矩陣相乘 矩陣A[p1, p2] 和 B[p2, p3] 相乘,需要p1*p2*p3次乘法,得到 [p1, p3]的矩陣。若一系列的矩陣相乘,順序不同,所需乘法的數量不一樣。 像 [1, 3]*[3, 5]*[5, 4],若先乘前兩項,會需要1*3*5 + 1*5*4 = 35次乘法;若先乘後兩項,則需要3*5*4 + 1*3*4 = 72次乘法。 現在給定n個矩陣的大小,保證一定可乘,求最少需幾次乘法?要怎麼乘? DP元素:m[a, b] 表示 從矩陣a乘到矩陣b所需的最少乘法數 遞迴式:m[a, b] = min{m[a, k] + m[k+1, b] + ax*ky*by | a = k b } 題5 最大子矩陣 給定一矩陣m,求一個子矩陣其中的元素和最大。 5-1 一維矩陣 最暴力的做法是O(n3),對每個起點、終點都加一次,求最大值。 用預先累加的pre - processing技巧可以做到O(n2)。 最好的做法是O(n)。 DP元素:sum[a] 表示 結束在a的最大子矩陣和 遞迴式:sum[a] = max{ 0 , sum[a-1] } + m[a] 5-2 二維矩陣 窮舉所有可能的起點、終點,並一一算出每個子矩陣的和,再求最大值,這個方法是O(n6)。 同樣用pre-processing的技巧,可以變成O(n4)。這裡的pre-processing,是讓m[a, b] 代表 [1, 1] – [a, b] 內的元素和。[a, b

您可能关注的文档

文档评论(0)

magui + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8140007116000003

1亿VIP精品文档

相关文档