Advanced Competitive Programming

Slides:



Advertisements
Similar presentations
渡黑水溝 郁永河. 2 戎克船:是明末清初時期往返兩岸的主要交通工具 ∗ 1. 關於台灣的開發歷史,我們到底了解多少呢?不妨試著說出 就我們所知有關台灣開發史的故事、小說、電影、音樂與大 家分享。 ∗ 2. 什麼是黑水溝?黑水溝為什麼會成為大陸移民渡海來臺時最 大的威脅? ∗ 3. 有聽過「六死三留一回頭」、「有唐山公,無唐山嬤」這兩.
Advertisements

1 教師敘薪 Q & A 教師敘薪 Q & A 新竹縣立新湖國中 陳淑芬 新竹縣立自強國中 楊美娟
103 學年度縣內介聘申請說明會 南郭國小 教務主任張妙芬.  重要作業日程 : 1 、 5/1( 四 ) 前超額學校 ( 含移撥超額 ) 備文函報縣府教 育處輔導介聘教師名單 2 、 5/7( 三 ) 超額教師積分審查( 9 : : 00 、 13 : : 00 )。 3.
大學甄選申請入學 〃備審資料 〃面試. 確認你的追求對象 學校環境概況 系別特質 有無交換學生 未來出路 性質相似的科系要清楚之間的差別 ex: 社會福利學系,社會工作學系, 社會學系.
人文行動考察 羅東聖母醫院 老人醫療大樓 吳采凌 黃玨宸 劉映姍 陳嫚萱.
焦點 1 陸域生態系. 臺灣的陸域生態系 臺灣四面環海 黑潮通過  高溫, 雨量充沛 熱帶, 亞熱帶氣候.
資源問題與環境保育 第 6 章. 學完本章我能 ……  知道中國土地資源的問題與保育  了解中國水資源的問題與保育  知道中國森林資源的問題與保育  能分析自然環境和人文環境如何影響人類 的生活型態  說舉出全球面臨與關心的課題.
大學教育的理念與價值 J. H. Wang Sep. 27, 大學是什麼 ? 大學法第一條 : – 大學以研究學術,培育人才,提升文化,服務 社會,促進國家發展為宗旨 。 – 大學應受學術自由之保障,並在法律規定範圍 內,享有自治權。
VMSF 內核級虛擬機監控器調度框架 1 張力升 Dept. of Electrical Engineering National Cheng Kung University Tainan, Taiwan, R.O.C
景美樣品房工程變更 / 追加請款 / 說明 102/08/09 樣品房停工 102/10/10 樣品房完工 102/09/26 向工務部提出 追加工程估價單 102/10/25 經工務部審核 轉送採發部門 102/09/03 工地會議 確認後續施工方式 102/11/ /11/ /12/09.
統計之迷思問題 保險 4B 張君翌. 迷思問題及教學者之對策 常見迷思概念教學者之對策 解題的過程重於答案 例 : 全班有 50 位同學,英文不及格的有 15 人,數學不及格的有 19 人,英文與 數學都及格的有 21 人。請問英文與數 學都不及格的有幾人? 老師常使用畫圖來解決這樣的問題,英文和.
社團法人台南市癲癇之友協會 講師:王乃央老師
寓言 何謂寓言? 寓言中的主角選擇 以動物為主角,形象分析—以成語及諺語中來歸納動物形象 以人為主角,形象分析
第七章 外營力作用 第一節 風化 第二節 崩壞 第三節 侵蝕與堆積.
对应用型本科建设中若干问题的认识 张家钰
物理治療師之僱傭關係 九十二年四月十二日.
勿讓權利睡著- 談車禍之損害賠償與消滅時效.
二、開港前的經濟發展 (一)土地開墾和農業發展 1.漢人移民的遷徙與拓墾 (1)遷徙 A.居住區 a.泉州人最多:沿海
設計新銳能量輔導 實習期中感想 實習生:賴美廷 部落格:TO13004.
日本的〈地獄劇〉 與 中國的〈目連戲〉.
授課教師:羅雅柔 博士 學員:吳沛臻/邱美如/張維庭/黃茹巧
关于市场营销的分析 ——以九阳豆浆机为例 品牌经营——让每一个家庭都拥有一台九阳豆浆机 营销管理——采取文化、概念、网络等营销组合
國小教師檢定經驗分享 分享者:胡瑋婷 現職:國語日報語文中心寫作班教師 閱讀寫作營教材編輯及任課講師 榮獲「教育部教育實習績優獎」全國第三名.
民主政治的運作
教育與學習科技學系 103學年度課程說明 103年9月2日.
國有不動產撥、借用法令與實務 財政部國有財產局 接收保管組撥用科 蔡芳宜.
大學教、職員之法義務規範與法律效果 台南地檢署林仲斌.
明代開國謀臣 劉伯溫 組員:吳政儒 林天財 王鈴秀 陳冠呈 施典均 李孟儒.
国王赏麦的故事.
中國宦官 鄭永富 鄭雅之 莊尉慈.
Dynamic Programming.
簡報大綱 壹、親師溝通 貳、學生不當行為的處理 參、學生輔導 肆、個案研討分析.
貨物稅稅務法令介紹 竹東稽徵所.
授课教师简历 刘付才,男,中学高级教师,亳州一中南校体 育教研组长,全国体育优质课一等奖获得者,华佗 五禽戏第五十八代传承人;长期从事五禽戏教学和 研究工作,参与创编了国家级课题“校园五禽戏”; 2014年全国学生运动会展示中获得优秀表演奖; 2015年指导的五禽戏传人进行的五禽戏教学获得全 国一等奖,编著的《华佗五禽戏之简易健身操》即.
北京大学网络与信息系统研究所人工智能实验室
洪涝灾害重点传染病的预防 江苏省疾病预防控制中心 汪华.
平行控制 數據驅動的計算控制方法 陳品杰 Department of Electrical Engineering
九年一貫課程綱要微調 健康與體育領域召集人 「課綱微調轉化」研習
崇拜即將開始,請大家安靜片刻, 預備心靈敬拜上帝。
公私立大學特色介紹 (以第二類組為主) 報告人:吳婉綺.
小 桔 灯 市场赢利能力与战略 主讲:杨贤耀.
危險情人的特徵 危險情人的特徵.
機關團體所得稅申報實務 中區國稅局苗栗縣分局第一課林天琴.
践行新时期广东精神 推进广东公路文化繁荣与发展 ——关于广东省公路文化建设与实践的思考
水土保持法中「連續處罰」及「限期改正」制度之法律研究
國有公用財產管理及被占用處理暨活化運用法規與實務(含座談) 104年度教育部暨部屬機關學校總務人員研習會-不動產管理班
Department of Computer Science & Information Engineering
提升國民小學教師健康教育專業能力三年計畫
COMPUTEX 2014 A note given in BCC class on June 4, 2014
馬公高中100學年101大學博覽會 專題演講 演講主題 如何選填適合自己的大學科系
性騷擾防治宣導.
創業環境分析與 風險評估 赫斯提亞負責人:謝馥仲先生 主講 演講時間 : 2008/05/01.
10465: Homer Simpson ★★★☆☆ 題組:Problem Set Archive with Online Judge
動態規劃 Dynamic Programming (DP)
葉脈標本的創意製作.
穿出自我… 高一家政.
程式的時間與空間 Time and Space in Programming
二分查找的应用 ——李江贝, 郝琰 2017年9月28日.
財政四 徐瑜鴻 財政四 林博硯 財政四 陳玄恩 財政四 王張皓鈞 財政四 李定瑜
品格:熱 性格的培養6親熱就,48頁。 (一)什麼是熱.
Advanced Competitive Programming
Advanced Competitive Programming
Advanced Competitive Programming
Advanced Competitive Programming
Tree Riddles Kun-Mao Chao (趙坤茂)
Tree Riddles Kun-Mao Chao (趙坤茂)
DDoS A note given in BCC class on May 15, 2013 Kun-Mao Chao (趙坤茂)
Advanced Competitive Programming
Department of Mechatronic Technology National Taiwan Normal University
Presentation transcript:

Advanced Competitive Programming 國立成功大學ACM-ICPC程式競賽培訓隊 nckuacm@imslab.org Department of Computer Science and Information Engineering National Cheng Kung University Tainan, Taiwan

Dynamic Programming

Outline Intro to DP Knapsack problem Longest Increase Subsequence (LIS) Longest Common Subsequence (LCS)

What is DP ? DP 是啥能吃嗎?

Intro to DP 4 計算費伯納契數列

Intro to DP 4 計算費伯納契數列 3 2

Intro to DP 4 計算費伯納契數列 3 2 2 1

Intro to DP 4 計算費伯納契數列 3 2 2 1 1

Intro to DP 4 計算費伯納契數列 3 2 2 1 1

Intro to DP 動態規劃 = 分治 + 記憶化 三個重要性質 最優子結構 重複子問題 後無效性

最優子結構 問題的最優解,是子問題最優解的合併解。 其子問題也具有同樣的特性

重複子問題 有很多子問題可歸為同樣的問題 -> 引入記憶化

後無效性 確定的子問題解,並不會受到其他決策影響

Knapsack problem 背包問題: 給定一個固定大小的背包, 以及各種不同大小和價值的物品, 問如何放置物品使得背包中總價值最大

Knapsack problem 聽起來很貪心? 來看個例子 假設背包容量 = 8 10 2 80 3 110 4 150 5 200 6 價值 體積 10 2 80 3 110 4 150 5 200 6

Knapsack problem 經典背包問題 無限背包 01 背包 多重背包

Knapsack problem 經典背包問題 疊積木

無限背包問題 對於每一種物品,其個數是無限多個 價值 體積 10 2 80 3 110 4 150 5 200 6

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 定義 P[i] : 第 i 個物品的價值 定義 V[i] : 第 i 個物品的體積 價值 體積 10 2 80 3 110 4 150 5 200 6 S[i] 即是將主問題和子問題關聯起來

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 10 2 80 3 110 4 價值 體積 10 2 80 3 110 4 150 5 200 6

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 初始化為 0 10 2 80 3 價值 體積 10 2 80 3 110 4 150 5 200 6

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = ? 10 2 80 價值 體積 10 2 80 3 110 4 150 5 200 6 要和子問題關聯起來

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = S[n-V[i]] + P[i] ? 價值 體積 10 2 80 3 110 4 150 5 200 6 透過一次一次的將新的物品加入其中,我們可以不斷更新 S[i] 成為到目前為止的最佳解

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 開始疊積木 每次去看扣掉物品體積大小的那個背包,他的最佳解是多少

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 20

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 20 20

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 20 20 30

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 20 20 30 30

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 20 20 30 30 40

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 20 20 30 30 40 40

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 80 20 20 30 30 40 40

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 20 80 20 30 30 40 40

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 90 20 90 30 30 40 40

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 20 90 30 160 30 40 40

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 20 90 160 30 100 40 40

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 20 90 160 100 40 170 40

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 20 90 160 100 170 40 240

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 20 110 90 160 100 170 240

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 110 90 110 160 100 170 240

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 110 110 160 100 170 240

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 110 110 160 100 190 170 240

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 110 110 160 190 170 220 240

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 110 110 160 190 220 240

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 110 150 160 190 230 260

無限背包問題 對於每一種物品,其個數是無限多個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 110 150 200 210 230 280

無限背包問題 for (int i = 0; i < C; ++i) { for (int j = V[i]; j <= N; ++j) { S[j] = max(S[j], S[j - V[i]] + P[i]); } 注意有些題型轉成背包問題後可能不適用這個做法,如硬幣問題

無限背包問題 UVa OJ 10980 Lowest Price in Town POJ 2063 Investment

01 背包問題 對於每一種物品,至多拿一個 做法和無限背包相似,差在順序 策略是由後向前更新

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 10

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 10 10

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 10 10 10

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 10 10 10 10

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 10 10 10 10 10

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 10 10 10 10 10 10

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 10 10 10 10 10 10 90

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 10 10 10 10 10 90 90

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 10 10 10 10 90 90 90

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 10 10 10 90 90 90 90

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 10 10 90 90 90 90 90

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 10 80 90 90 90 90 90

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 10 80 80 90 90 90 90 90

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 80 90 90 90 90 90 200

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 80 90 90 90 90 190 200

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 80 90 90 90 190 190 200

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 80 90 90 120 190 190 200

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 80 90 110 120 190 190 200

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 80 110 110 120 190 190 200

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 110 150 150 190 230 260

01 背包問題 對於每一種物品,至多拿一個 定義 S[n] : 當背包的容量只有 n 時,問題的最佳解 S[n] = max(S[n], S[n-V[i]] + P[i]) 價值 體積 10 2 80 3 110 4 150 5 200 6 10 80 110 150 200 200 230 280

01 背包問題 for (int i = 0; i < C; ++i) { for (int j = N; j >= V[i]; --j) { S[j] = max(S[j], S[j - V[i]] + P[i]); } 注意有些題型轉成背包問題後可能不適用這個做法,如硬幣問題

01 背包問題 UVa OJ 624 CD UVa OJ 10819 Trouble of 13-Dots

多重背包問題 對於每一種物品,其個數是有限多個

多重背包問題 對於每一種物品,其個數是有限多個 對該種物品,我們可以選擇 1, 2, 3, 4, …, n 個

多重背包問題 對於每一種物品,其個數是有限多個 轉為 01 背包問題 若第 i 種物品可選 n 個,則換成 n 個第 i 種物品

多重背包問題 利用 binary 技巧優化 若第 i 種物品可選 n 個,則將其換為多件物品, 物品的大小與價值皆為 r 倍的原物品大小與價值 r = { 1, 2, 4, …, 2k-1, n - (2k -1) } , k 為滿足 n - (2k -1) > 0 的最大整數

多重背包問題 舉個例子,當物品可選 13 個 則 k = 3, r = { 1, 2, 4, 6 } =>造出 4 件物品,個別包含 1, 2, 4, 6 個原物品

Questions?

DP 經典問題 LIS and LCS

Longest Increasing Subsequence

定義問題 在一數值序列中 找到一個子序列 使得子序列元素的數值依次遞增 並且使子序列的長度儘可能地大。

補充說明 -子序列 原序列: 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 子序列: 元素前後順序性不更動 可不連續元素 Ex:   0, 6, 14, 15 8, 4, 12, 11, 7, 15

補充說明 –遞增子序列 原序列: 遞增子序列: 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 遞增子序列: 元素的數值依次遞增 Ex:   合法 0, 6, 14, 15 不合法 8, 4, 12, 11, 7, 15 (雖然是子序列 但是沒有遞增) Note: 我們先從嚴格遞增討論起。

補充說明 –最長遞增子序列 原序列: 最長遞增子序列 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 最長遞增子序列 有沒有人要回答

Longest Increasing Subsequence 對每個元素分析找出 LIS Longest Increasing Subsequence

LIS 要素 時間軸 對過去紀錄 對現在進行整理 對未來充分準備

時間軸 T = 1 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 T = 4 直到 T = 16 結束 Note: 過去, 現在, 未來

思考一個問題: 至少要大於 x 才可以接在 k 個數字之後。 如何記錄過去? 思考一個問題: 至少要大於 x 才可以接在 k 個數字之後。 0, 8, 4, [Now] 對於 一個數字 比 x=4 大 就可以接在 k=2個數字之後

Anime 1 影片網址:https://youtu.be/1V881saODNs 思考一個問題: 至少要大於 x 才可以接在 k 個數字之後。

動畫說明 第一行 [x] 代表現在正在處理的數字。 在 After 裡面 [4]:25 的意思是: 對於未來至少要大於25 才可以接再4個數字之後。

同樣可以讓未來接續在 k 個數字之後,那麼越小越優 如何整理現在? 同樣可以讓未來接續在 k 個數字之後,那麼越小越優

說明 在處理 「現在」 之前 在處理 「現在」 之後 「未來」至少需要大於 29 才可以接續在4個數字之後。 Ex: 6 15 19 29 [未來] 在處理 「現在」 之後 「未來」至少需要大於 25 就可以接續在4個數字之後。 Ex: 6 15 19 25 [未來]

Anime 2 影片網址:https://youtu.be/RsG37c3z4ds

確定未來是未來:未來是不能夠影響現在與過去 如何對未來充滿希望? 確定未來是未來:未來是不能夠影響現在與過去

說明 想想看? 整理過去的時候需不需要未來的資料?

至於往前回溯找出任意一組 LIS 那就是各位想一想的啦! Hint! 整理「現在」要做紀錄。

https://judge.cp.ccns.io/problem/a009 練習時間 a009 All the Way North https://judge.cp.ccns.io/problem/a009

片段程式碼 for(int i = 0; i < n; i++) { int j = lower_bound(v.begin(), v.end(), a[i]) - v.begin(); if(j == v.size()) v.push_back(a[i]); else v[j] = a[i]; }

Longest Common Subsequence

定義問題 在兩個序列(A, B)中 找到一個共同子序列 並且使子序列的長度儘可能地大。

補充說明 -子序列 原序列: 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 子序列: 元素前後順序性不更動 可不連續元素 Ex:   0, 6, 14, 15 8, 4, 12, 11, 7, 15

補充說明 – 共同子序列 原序列: 共同子序列 A: ATCGCCTC B: TCGCATCA 合法: CTC 不合法: TCA (不是A的子序列)

LCS 要素 切割小問題(記錄過去) 轉換狀態(處理現在) 序列A的前i個元素與序列B的前j個元素的 LCS 長度。 其實思路上與 LIS 差不多,只是這裡就直接使用術語,而不是 「過去、現在」。 切割小問題(記錄過去) 序列A的前i個元素與序列B的前j個元素的 LCS 長度。 轉換狀態(處理現在) 在已知「序列A的前i個元素與序列B的前j個元素的 LCS 長度」的時候 在已知「序列A的前i+1個元素與序列B的前j個元素的 LCS 長度」的時候 在已知「序列A的前i個元素與序列B的前j+1個元素的 LCS 長度」的時候 計算「序列A的前i+1個元素與序列B的前j+1個元素的 LCS 長度」

狀態轉換示意圖

回溯示意圖

Question?