Luogu P1880 石子合併 題解報告

2022-04-28 20:48:17 字數 1153 閱讀 9335

題目傳送門

【題目大意】

在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。

試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分。

【思路解析】

首先是斷環為鏈,這題資料不大,沒什麼問題。

說一下轉移方程吧$$f[l][r]=min(f[l][r],f[l][k]+f[k+1][r])+sum[r]-sum[l-1](l\le k目標:$min(f[i][i+n-1])(i\in[1,n]),max(g[i][i+n-1])(i\in[1,n])$.

還有就是要注意一下迴圈巢狀的順序,哪乙個迴圈在裡面,哪乙個迴圈在外面。

【**實現】

1 #include2

#define rg register

3#define go(i,a,b) for(rg int i=a;i<=b;i++)

4#define back(i,a,b) for(rg int i=a;i>=b;i--)

5#define mod 2147483648

6#define ll long long

7using

namespace

std;

8const

int n=102

<<1;9

intn,a[n],sum[n];

10ll f[n][n],g[n][n];

11int

main()

22 f[l][r]+=sum[r]-sum[l-1

];23 g[l][r]+=sum[r]-sum[l-1

];24

}25 ll ans1=123456798,ans2=0

;26 go(i,1,n) ans1=min(ans1,f[i][i+n-1]),ans2=max(ans2,g[i][i+n-1

]);27 printf("

%lld\n%lld\n

",ans1,ans2);

28return0;

29 }

**戳這裡

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 石子合併 環形DP

先放上luogu的石子合併題目鏈結 這是一道環形dp題,思想和能量項鍊很像,在預處理過程中的手法跟乘積最大相像。用乙個m陣列來儲存石子數量,m i j 表示從第 i 堆石子到第 j 堆石子的總數。接下來三重迴圈 i 表示合併操作的起始位置,j 表示合併操作的終點,也就是把 i 到 j 合併 k表示間...

洛谷1880 石子合併

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