NC50493 環形石子合併

2022-06-09 18:42:08 字數 735 閱讀 4435

狀態表示:\(f(i,j)\):從下標\(i\)合併到下標\(j\)的最大價值。

先看石子合併(\(n\)堆石子):

\[1,2,...,n

\]\(f(1,n)\)即為答案。

再看環形:

最後的答案為:\(f(1,n)(f(n,1)和f(1,n)結果相同),f(2,1),f(3,2),...,\)中的最小值。

我們當然不能在環上直接\(dp\),因為這樣\(f(2,1),f(3,2)\)的合併結果不一定構成環形,可能是直接將相鄰的兩堆合併來得到\(f(2,1),f(2,3)\)的值。

於是,破環成鏈應運而生!

將石子\(1~n\)複製一遍,得到:

\[1,2,...,n,1,2,...,n

\]參考石子合併,我們可以得到\(f(1,n),f(2,1),...,f(n,n-1)\)的值,最後在它們中取最優值即可。

const int n=410;//兩倍空間

int f[n][n];//min

int g[n][n];//max

int a[n<<1];

int sum[n<<1];

int n;

int main()

}int resf=inf,resg=0;

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

cout<

cout<

//system("pause");

}

1 3 環形佇列

實現 public class circlearrayqueuedemo catch exception e class circlearrayqueue public boolean isfull public boolean isempty public void addqueue int va...

141 環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。高階 你能否不使用額外空間解決此題?乙個快指標走兩步 乙個慢指標走一步 如果相遇就有環 不然沒環 class solution def hascycle self,head type head listnode rtype bool index1 head inde...

1148環形石子合併

時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述在乙個圓形操場的四周擺放著n堆石子 n 100 現要將石子有次序地合併成一堆。規定每次只能選取相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。編一程式,讀入石子堆數n及每堆的石子數 20 選擇一種合併石子的方...