Luogu P1880 石子合併 環形DP

2022-05-01 02:12:09 字數 1104 閱讀 2375

先放上luogu的石子合併題目鏈結

這是一道環形dp題,思想和能量項鍊很像,在預處理過程中的手法跟乘積最大相像。

用乙個m陣列來儲存石子數量,m[i][j]表示從第 i 堆石子到第 j 堆石子的總數。

接下來三重迴圈

i 表示合併操作的起始位置, j 表示合併操作的終點,也就是把 i 到 j 合併

k表示間斷點,即 i 到 j 合併過程中選擇k點來作為合併位置 

狀態轉移方程

f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+m[i][k]+m[k+1][j]);

d[i][j]=min(d[i][j],d[i][k]+d[k+1][j]+m[i][k]+m[k+1][j]);

注意該題有乙個拆環為鏈的思想,設從1到n的石子數為12345

實際存到陣列裡的就是123451234

這樣化成鏈就可以避免複雜的取餘  畢竟作者迴圈佇列學的不好,用乙個環做的話一會就搞暈了

最後貼**

1 #include2 #include3

using

namespace

std;

4int q[1000];5

int m[300][300];6

int f[300][300];7

int d[300][300];8

intmain()

16 m[1][1]=q[1

];17

for(int i=1;i<=n*2-1;++i) m[1][i]=m[1][i-1]+q[i];

18for(int i=1;i<=n*2-1;++i)

19for(int j=i;j<=n*2-1;++j)

20 m[i][j]=m[1][j]-m[1][i-1

];21

for(int i=n*2-1;i>=1;--i)

22for(int j=i+1;j<=i+n&&j2;++j)28}

29int maxx=0,minn=0x7fffffff;30

for(int i=1;i<=n;++i)

34 cout35return0;

36 }

luogu P1880 石子合併

原題原題原題原題原題 先貼上錯誤 錯誤 include include include using namespace std int f 1100 1100 f2 1100 1100 st 1100 a 1100 int main for int i n 1 i 2 n i st i st i 1...

Luogu P1880 石子合併 題解報告

題目傳送門 題目大意 在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分。思路解析 首先是斷環為鏈,這題資料不大,沒什麼問題。說一下轉移方...

洛谷1880 石子合併

在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.輸入格式 資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數,分別...