給定長爲n的序列a[i],每次能夠將連續一段迴文序列消去,消去後左右兩邊會接到一塊兒,求最少消幾回能消完整個序列,n≤500。spa
f[i][j]表示消去區間[i,j]須要的最少次數。blog
則; 擴展
若a[i]=a[j],則還有。方法
這裏其實是以區間長度爲階段的,這種DP咱們一般稱爲區間DP。 im
區間DP的作法較爲固定,即枚舉區間長度,再枚舉左端點,以後枚舉區間的斷點進行轉移。d3
區間類型動態規劃是線性動態規劃的拓展,它在分階段劃分問題時,與階段中元素出現的順序和由前一階段的哪些元素合併而來有很大的關係。(例:f[i][j]=f[i][k]+f[k+1][j]) 總結
區間類動態規劃的特色: 數據
【問題描述】db
將n(1≤n≤200)堆石子繞圓形操場擺放,現要將石子有次序地合併成一堆。規定每次只能選相鄰的兩堆石子合併成新的一堆,並將新的一堆的石子數,記爲該次合併的得分。 (1)選擇一種合併石子的方案,使得作n-1次合併,得分的總和最小。 (2)選擇一種合併石子的方案,使得作n-1次合併,得分的總和最大。img
【樣例輸入】
4
4 5 9 4
【樣例輸出】
43
54
貪心解法:
貪心共62分☝
正解共61分☟
【思路點撥】
無環正解: 對應到動態規劃中,就是兩個長度較小的區間上的信息向一個更長的區間發生了轉移,劃分點k就是轉移的決策,區間長度len就是DP的階段。根據動態規劃「選擇最小的能覆蓋狀態空間的維度集合」的思想,能夠只用左、右端點表示DP的狀態。
sum[i]:從第1堆到第i堆石子數總和。
Fmax[i][j]:將從第i堆石子合併到第j堆石子的最大得分;
Fmin[i][j]:將從第i堆石子合併到第j堆石子的最小得分;
初始條件:Fmax[i][i]=0,Fmin[i][i]=INF
則狀態轉移方程爲:(其中i<=k<j)
時間複雜度爲。
【環的處理】破環成鏈
注意到:題目中石子是圍成一個圈,而不是一條線。
【例題二】凸多邊形的劃分:
【問題描述】
給定一個具備N(N≤50)個頂點(從1到N編號)的凸多邊形,每一個頂點的權均是一個正整數。問:如何把這個凸多邊形劃分紅N-2個互不相交的三角形,使得這些三角形頂點的權的乘積之和最小?
【輸入示例】
5
121 122 123 245 231
【輸出示例】
12214884
【題目分析】
若是咱們按順時針將頂點編號,從頂點i到頂點j的凸多邊形表示爲以下圖:
設f[i][j](i<j)表示從頂點i到頂點j的 凸多邊形三角剖分後所獲得的最大乘積,當 前咱們能夠枚舉點k,考慮凸多邊形(i,j)中 剖出三角形(i,j,k),凸多邊形(i,k), 凸多邊形(k,j)的最大乘積和。咱們能夠獲得 動態轉移方程:(1<=i<k<j<=n)
初始條件:f[i][i+1]=0; 目標狀態:f[1][n];
時間複雜度爲:。
但咱們能夠發現,因爲這裏爲乘積之和,在輸入數據較大時有可能超過長整形範圍,因此還需用高精度計算。
【總結】
基本特徵:將問題分解成爲兩兩合併的形式。
解決方法:對整個問題設最優值,枚舉合併點,將問題分解成爲左右兩個部分,再將左右兩個部分的最優值進行合併獲得原問題的最優值。
設i到j的最優值,枚舉剖分(合併)點,將(i,j)分紅左右兩區間,分別求左右兩邊最優值,以下圖:
狀態轉移方程的通常形式以下: