NOI1995 石子合併

2022-07-16 20:09:15 字數 712 閱讀 8020

本來以為是一道簡單的區間dp問題,草草地寫了個程式結果樣例都沒過,仔細一看,原來n堆石子擺成了環。區間dp是線性dp的一種,寫法比較固定,一般是先列舉區間長度,再列舉區間左端點,推出區間右端點,狀態轉移通常是列舉中間點。這道題雖然成了環,但本質是不變的,還是從2到n列舉區間長度,只不過區間左端點可以是1到n,區間右端點可以在左端點左側。為了方便起見,我們可以直接把環變為鏈跑區間dp,仔細想想,可以把長度為n的環用長度為2*n-1的鏈來代替。只不過這樣,就不能方便的把dp[1][n]作為答案了,而是當區間長度列舉到n時,用每次求出dp值更新答案。詳見**。

1 #include 2 #include 3

4using

namespace

std;56

const

int maxn = 2 * 105, inf = 0x3f3f3f3f;7

8int

num[maxn], sum[maxn], dp1[maxn][maxn], dp2[maxn][maxn];910

intmain()

26if (l == n) ans1 = min(ans1, dp1[i][j]), ans2 =max(ans2, dp2[i][j]);27}

28 printf("

%d\n%d

", ans1, ans2);

29return0;

30 }

ac**

NOI1995 石子合併

在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.圓的話就用2 n 1,即只有n種情況 include using namespace ...

NOI 1995 石子合併

合併石子的加強版 不過這可是95年的noi的題,準確說應該是合併石子是它的削弱版吧。環的處理就是在鏈的後面再來一遍鏈,然後列舉一下起點終點,就和合併石子一樣了。include include include include include define inf 0x3f3f3f3f using na...

NOI1995 石子合併

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