POJ 1390 Blocks 區間DP 題解

2022-05-06 21:39:06 字數 1088 閱讀 7042

題意

t組資料,每組資料有n個方塊,給出它們的顏色,每次消去的得分為相同顏色塊個數的平方(要求連續),求最大得分。

首先看到這題我們發現我們要把大塊盡可能放在一起才會有最大收益,我們要將相同顏色塊合在一起,我們可以分區間進行處理,便可用區間dp解決,我們嘗試合併區間我們定義狀態f[i][j]表示合併i-j這個區間的最大得分,那麼狀態轉移方程便可寫為

f[i][j]=max(f[i][j],f[i][u]+f[v][j]+(v-u+1)^2)(i=我們可以發現我們這樣去做不一定就是最優的,因為我們可以通過操作使顏色塊數量增加。

如圖我們發現如果按照前面設計的狀態轉移方程來消去是不合理的,因為我們可以將外面的容納進來再進行消去會獲得更大的收益

此時dp不滿足,我們可以考慮再加入乙個維度,定義f[i][j][k]表示代表合併區間[i, j]內的顏色塊,並且有k個顏色塊與j顏色塊相同的最大得分。

1:先把第j個顏色塊和後面的k個顏色塊合併了。

2:先不急著合併,看一看[i, j - 1]中有沒有與j顏色相同的,如果有(假設這個和j顏色相同的顏色塊是p),那麼先把[p, j - 1]合併了。

此時狀態轉移方程為

f[i][j][k]=f[i][j-1][0]+(len[j]+k)^2(len為顏色相同的長度)

f[i][j][k]=f[i][p][k+len[j]]+f[p+1][j-1][0]。

結合範圍取最大值即可

#include#include#includeusing namespace std;

int t,n,dp[210][210][210];

int c[210],len[210],tot;

int solve(int l,int r,int k)

} return dp[l][r][k];

}int main()

else

} printf("case %d: %d\n",t,solve(1,tot,0));

} return 0;

}

poj 1390 消除方塊 blocks

今天中午從黑書上看到了的一道例題,動態規劃 線性模型的例1題。看書都看不懂!後面還是看了網上的題解,才漸漸明白.估計我也說不清楚,所以盡力好了。樣例 1 2 2 2 2 3 3 3 1 我們建立兩個陣列 color,num.其中,color儲存的是顏色值,num是相同顏色的個數。例如,對上面的樣例來...

POJ 3734 Blocks 矩陣乘法

依舊是神奇的矩陣乘法,構思很巧妙,雖說看著很簡單,但是確實沒練過矩陣題,所以就沒這個意識去想到狀態轉移矩陣了。依舊是參考的別人的思路,也堅定了我要學好矩陣的決心。有四種顏色,其中紅色和綠色必須是偶數,那麼我們可以分四種狀態,一,紅為偶數,綠為偶數 二,紅為奇數,綠為偶數,三,紅為偶數,綠為奇數 四,...

poj 3734 Blocks (生成函式)

題目大意 給n個格仔染色,有紅藍綠黃四種顏色,其中紅綠格仔的顏色都必須是偶數個。求滿足條件的染色方案。排列問題可以用指數型生成函式。答案就是e2 x e x e x2 2 中xn 的係數乘n 化簡一下e4 x 2e 2x4 因為e kx中x n 的係數為kn n 所以an s 4n 2 2 n4 n...