先放上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 #include3using
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個數,分別...