1. 程式人生 > >區間dp總結(更新中)

區間dp總結(更新中)

前一陣跟著紫書學了區間dp,趁著還沒涼再複習複習

   題目要求 : 有n堆石子排成一行,每次選擇相鄰的兩堆石子,將其合併為一堆,記錄該次合併的得分為兩堆石子個數之和。已知每堆石子的石子個數,求當所有石子合併為一堆時,最小的總得分。

    解題思路 : 將每個大的區間劃分成最小長度為2的區間,然後逐步擴大尋求最優解,由區域性最優達到整體最優

    狀態轉移方程 : dp[i][j] = dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1](sum[i] = a[1]+a[2]+...+a[i])

    題解 : 題解

    題目要求 : 給出一個括號序列括號型別包括'(',')','[',']'求最大的括號匹配數

    解題思路 :把大區間拆分成最小長度為2的小區間,後逐步擴大尋求最優解,處理的條件是

    if((a[i] == '(' && a[j] == ')')|| (a[i] == '[' && a[j] == ']'))

                    dp[i][j] = dp[i+1][j-1] + 2

    這樣算是對小區間先進行了預處理,然後再拼接成大的區間,每次尋求區域性最優解,以達到整體最優

    狀態轉移方程 : dp[i][j] = max(dp[i][k]+dp[k+1][j],dp[i][j])

    題解 : 

題解

3. 整數拆分 : 題目連結

    題目要求 : 給出兩個整數 n , m ,要求在 n 中加入m - 1 個乘號,將n分成m段,求出這m段的最大乘積

    解題思路 :   對於給定問題,分析每個區間有兩個限制條件(區間長度,乘號數目),因此我們用dp[i][j],表示1-i區間內加上j個乘號的最優解,這樣最大的好處就是同時對兩個限定條件同時進行了約束

    狀態轉移方程 : dp[i][j] = max(dp[i][j], dp[k][j-1]*num[k+1][i])

    題解 : 題解

4. 最優三角剖分 : 題目連結

    (這道題沒有學過計算幾何所以做不出來,但是三角剖分思路都是一樣的)

    大致題目要求 :將多邊形拆成若干個不相交的三角型,問怎樣拆才能使每個三角型的三個定點的乘積(和)最大

    解題思路 :  先將多邊形拆出來一個三角型,然後由小區間到大區間逐步求最優解

    狀態轉移方程 : d(i, j) = { max(d(i, k) + d(k, j) + w(i, j, k) | i < k < j }

    題目要求 : 有一根長為L的木棍,還有n個切割位置,你的任務是在切割點把棍子切成n+1部分,使得總切割費用最小,每次切割的費用相當於被切割的木棍長度

    解題思路 : 把所有切割點離散化,去掉除切割點以外的無用的點,木棍等效成一根僅由切割點組成的木棍,木棍起點權值為0,終點權值為L,這樣一根新的木棍就做好了,比如木棍長為10,切割點為2,4,7,我們就可以等效成0 2 4 7 10這樣一根木棍

    狀態轉移方程 : dp[i][j] = min(dp[i][k] + dp[k][j] + a[j] - a[i], dp[i][j])

    題解 : 題解

    題目要求 : 給定一個整數序列,除起點和終點外每一個點都可以取出,取出的花費為a[i]*a[i-1]*a[i+1],即自己的權值乘上左右兩邊的權值,問如何取費用最小

    解題思路 : 這是目前為止做過最與眾不同的一道區間dp了,思路有點妙,這道題正著思考是有很多不確定性的,比如選走了某一個數一定會對兩邊的數造成影響,所以反著來!第一次就考慮最後一個數,如果倒著思考就不用考慮前面的影響了,再加上是由小區間最優解拼接而來的最優解,實現了僅通過列舉“最後一取”而完成全部的選取過程,太妙了

    狀態轉移方程 : dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + a[i-1]*a[k]*a[j])

    題解 : 題解