題目傳送門
【題目大意】
在乙個圓形操場的四周擺放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個數,分別...