動態規劃經典——石子歸併
1.鏈式歸併
問題描述
設有N堆沙子排成一排,其編號為1,2,3,…,N(N<=100)。每堆沙子有一定的數量。現要將N堆沙子併成為一堆。歸併的過程只能每次將相鄰的兩堆沙子堆成一堆,這樣經過N-1次歸併後成為一堆。找出一種合理的歸併方法,使總的代價最小。
【輸入格式】
輸入由若干行組成,第一行有一個整數,n(1≤n≤100);表示沙子堆數。第2至m+1行是每堆沙子的數量。
【輸出格式】
一個整數,歸併的最小代價。
【輸入樣例】
輸入檔名:shizi.in
7
13
7
8
16
21
4
18
【輸出樣例】
輸出檔名:shizi.out
239
令f[i,j]表示歸併第i個數到第j數的最小代價,sum[i,j]表示第i個數到第j個數的和,這個可以事先計算出來。sum[i,j]可以在O(1)的時間內算出.
容易的到以下的動態轉移方程:
階段:以歸併石子的長度為階段,一共有n-1個階段。
狀態:每個階段有多少堆石子要歸併,當歸並長度為2時,有n-1個狀態;
當歸並長度為3時,有n-2個狀態;
當歸並長度為n時,有1個狀態。
決策:當歸並長度為2時,有1個決策;當歸並長度為3時,有2個決策;
當歸並長度為n時,有n-1個決策。
[演算法優化]
優化後,無非加了一個s[i,j] 記錄i...j之間f[i,j]為最優狀態的分割點
2.
環型石子合併
問題描述
在一個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。
試設計一個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。
輸入檔案
輸入檔案stone.in包含兩行,第1行是正整數n(1≤n≤100),表示有n堆石子。第2行有n個整數,分別表示每堆石子的個數。
輸出檔案
輸出檔案stone.out 包含兩行,第1行中的數是最小得分;第2行中的數是最大得分。
輸入樣例
4
4 4 5 9
輸出樣例
43
54
相關推薦
動態規劃經典——石子歸併
1.鏈式歸併 問題描述 設有N堆沙子排成一排,其編號為1,2,3,…,N(N<=100)。每堆沙子有一定的數量。現要將N堆沙子併成為一堆。歸併的過程只能每次將相鄰的兩堆沙子堆成一堆,這樣經過N-1次歸併後成為一堆。找出一種合理的歸併方法,使總的代價最小。 【輸入格式
合併石子(動態規劃經典題)
步驟: 1. 設狀態:f[i][j]表示從第i堆合併到第j堆,合併成一堆的最小得分 2. 初始狀態:f[i][i]=0; 最終狀態:f[1][n];//從第1堆合併到第n堆的最小得分 3.狀態轉移方程:f[i][j]=max(f[i][j],f[i][k]+f[k+
基於python的動態規劃經典問題(爬樓梯,取珠寶,最大子序列和,找零錢)
1,爬樓梯問題 一個人爬樓梯,每次只能爬1個或兩個臺階,假設有n個臺階,那麼這個人有多少種不同的爬樓梯方法 動態規劃的狀態轉移:第 i 個狀態的方案數和第 i-1, i-2時候的狀態有關,即:dp[i]=dp[i-1]+dp[i-2],dp表示狀態矩陣。 def climb_stai
LintCode 125: Backpack II (動態規劃經典題: 0-1揹包問題)
解法1: 經典DP解法。 時間複雜度O(MN),空間複雜度O(MN)。 注意:dp[m+1][n+1],如果定義成dp[m][n],dp[0][]就有歧義:到底表示不取任何包,還是取包0呢? class
【動態規劃】石子合併 (ssl 2863)
石 子 合 並
【NOJ1148】【DP_動態規劃】石子合併
1148.石子合併 時限:1000ms 記憶體限制:10000K 總時限:3000ms 描述 在一個圓形(圓形!!!圓形!圓形!)操場的四周擺放著n堆石子(n<= 100),現要將石子有次序地合併成一堆。規定每次只能選取相鄰的兩堆合併成新的一堆,並將新的一堆的石
nyist oj 17 單調遞增最長子序列 (動態規劃經典題)
單調遞增最長子序列 時間限制:3000 ms | 記憶體限制:65535 KB 難度:4 描述求一個字串的最長遞增子序列的長度 如:dabdbf最長遞增子序列就是abdf,長度為4
最大連續子序列和:動態規劃經典題目(2)
問題描述: 連續子序列最大和,其實就是求一個序列中連續的子序列中元素和最大的那個。 比如例如給定序列: { -2, 11, -4, 13, -5, -2 } 其最大連續子序列為{
動態規劃經典問題切鋼條
package 小米oj; public class 鋼條切割 { public static void main(String[] args) { int price[] = {1,5,8,9,10,17,17,20,24,30}; Syste
最大連續子序列——動態規劃經典問題
前幾天在牛客網上看到一道關於動態規劃的題目,完全不知如何著手。所以就去學習了一下動態規劃,參考網上的解析,跌跌撞撞把一道杭電上的最大連續子序列敲了出來。 題目來源: http://acm.hdu.edu.cn/showproblem.php?pid=1231 給定K個整數的
動態規劃經典題目總結
在演算法中,動態規劃題目算是比較經典的一類題目。在找工作中,不管是筆試,還是面試,我們經常會遇到用動態規劃來解決問題的情況,有時候面試官還需要我們現場手寫出動態規劃解法的程式碼。因此,在求職中能靈活的運用動態規劃就相當重要了。下面我總結出了一些經典的動態規劃題目,其中有些還是面試中遇到的。
動態規劃經典五題
DP一年多沒碰過了,今天突然想找找感覺,找了經典的幾道DP複習著敲了敲。雖然最大子矩陣,滑雪,石子合併等問題也足夠經典,我還是從中找了5道最經典的DP寫了這篇博文,如果您是大一,大二想踏入程式競賽的同學可以當習題做做,如果您像我一樣不是ACMer,平時專案中也很少用DP,同
POJ 1088 滑雪(動態規劃經典)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 63875 Accepted: 23387 Description Michael喜歡滑雪百這並不奇怪, 因為滑雪的確很刺激。可是為了獲得速度
動態規劃經典最優子結構總結
(1)0-1揹包: 如果有一個揹包,總載重量為Wt,有n個物品,每個物品重Wi,每個物品價值Ci,那麼如何裝才能讓這個包裡面東西的價值最高? dp[i][j]為前i個物品當中選擇裝進一個載重量為j的包裡最大價值,則: 初始化:dp【0】【x】=0;for i=0-》n;j=
編輯距離(動態規劃經典)
1183 編輯距離 編輯距離,又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替換成另一個字元
Leetcode 120. Triangle 三角形問題(動態規劃經典) 解題報告
1 解題報告 首先我承認我很二哈,這道題我明明已經做過了,但是剛剛不知道為什麼又去做了一遍,而且我查了下兩次的解法還有所差別(貌似是現在的版本有進步了呢) 問題就是一個三角形的陣列,求從頂部到下方的最短路徑。。 這個問題是太過經典+Easy的DP問題了,哈
動態規劃 java 石子問題(直線)
一.石子問題與動態規劃的矩陣相乘問題類似,剛開始我在陣列邊界上出現了小問題,讓我知道了,陣列的邊界一定到精確,<還是<=,n還是n+1,都要精益求精; 二 .還有就是在i到j石子之和處出現問題,1.sum[j]-sum[i-1] 2.sum[j
動態規劃經典——最長公共子序列
最長公共子序列 時間限制:3000 ms | 記憶體限制:65535 KB 難度:3 描述 咱們就不拐彎抹角了,如題,需要你做的就是寫一個程式,得出最長公共子序列。
動態規劃經典例題java實現
動態規劃演算法通常基於一個遞推公式及一個或多個初始狀態。當前子問題的解將由上一次子問題的解推出。使用動態規劃來解題只需要多項式時間複雜度,因此它比回溯法、暴力法等要快許多。 解決動態規劃問題的關鍵是要找到狀態轉移方程。將問題分解成最小的子問題,找到由子問題到
動態規劃經典教學題,上過《算導》的應該都會
本文始發於個人公眾號:**TechFlow**,原創不易,求個關注 今天是LeetCode專題第41篇文章,我們一起來看一道經典的動態規劃問題Edit Distance,編輯距離。 今天這道題我本來是想跳過的,因為它實在是太經典了,屬於典型的老掉牙問題了。但是想了想,一方面因為之前立了flag要把所有M