SDNU 1048.石子合并2(区间dp)
生活随笔
收集整理的這篇文章主要介紹了
SDNU 1048.石子合并2(区间dp)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Description
有n堆石子排成一圈,每次選擇相鄰的兩堆石子,將其合并為一堆,記錄該次合并的得分為兩堆石子個(gè)數(shù)之和。已知每堆石子的石子個(gè)數(shù),求當(dāng)所有石子合并為一堆時(shí),最小的總得分。Input
第一行一個(gè)整數(shù)n(1 <= n <= 200),表示石子堆數(shù); 第二行n個(gè)整數(shù)a(1 <= a <= 100),表示每堆石子的個(gè)數(shù),這些石子首尾相接排成一圈。Output
一個(gè)整數(shù),表示最小總得分。Sample Input
5 7 6 5 7 100Sample Output
175Source
Unknown #include<bits/stdc++.h> using namespace std;#define ll long long #define eps 1e-9 #define pi acos(-1)const int inf = 0x3f3f3f3f; const int mod = 1e9+7; const int maxn = 1000 + 8;int n, a[maxn], sum[maxn], dp[maxn][maxn], mi;int main() {std::ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;sum[0] = 0;for(int i = 1; i <= n; i++){cin >> a[i];sum[i] += a[i] + sum[i - 1];}for(int len = 1; len <= n; len++){for(int i = 1; i <= n; i++){int en = (i + len) % n == 0 ? n : (i + len) % n;int tmp;if(i + len <= n)tmp = sum[i + len] - sum[i - 1];elsetmp = sum[n] - sum[i - 1] + sum[(i + len) % n];dp[i][en] = inf;for(int k = 0; k < len; k++)dp[i][en] = min(dp[i][en], dp[i][(i + k) % n == 0 ? n : (i + k) % n] + dp[(i + k + 1) % n == 0 ? n : (i + k + 1) % n][en] + tmp);}}mi = dp[1][n];for(int i = 2; i <= n; i++)if(mi > dp[i][i - 1])mi = dp[i][i - 1];cout << mi <<'\n';return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/RootVount/p/11480394.html
總結(jié)
以上是生活随笔為你收集整理的SDNU 1048.石子合并2(区间dp)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SDNU 1045.石子合并1(区间dp
- 下一篇: SDNU 1171.合并果子(区间dp)