标签:max scribe out ret str psu 需要 通过 描述
第一行一个正整数n
第二行n个不超过1000的正整数,第i(1 \le i \le n)i(1≤i≤n)个数为第i颗珠子的头标记,当i \neq ni?=n时第i颗珠子的尾标记等于第i+1颗珠子的头标记,当i=n时第i颗珠子的尾标记等于第1颗珠子的头标记。
至于珠子的顺序,你可以这样确定:将项链放在桌面上,不要出现交叉,随机指定一颗珠子为第一颗珠子,按顺时针确定其它珠子的顺序。
输出只有一行,一个不超过2.1 \times10^92.1×109的正整数,表示最优聚合顺序所释放的能量。
4 2 3 5 10
710
#include<bits/stdc++.h> using namespace std; const int N = 2e2 + 7; int a[N], dp[N][N], n; int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i], a[i + n] = a[i]; a[2 * n + 1] = a[1]; for (int len = 2; len <= n; len++) { for (int l = 1; l <= 2 * n - len + 1; l++) { int r = l + len - 1; for (int k = l; k < r; k++) { //合并[l,k]和[k+1,r]消耗为[a[l],a[k]]*[a[k+1],a[r + 1]] = a[l] * a[k + 1] *a[r + 1] dp[l][r] = max(dp[l][r], dp[l][k] + dp[k + 1][r] + a[l] * a[r + 1] * a[k + 1]); //dp[i][i + 1] = dp[i][i] + dp[i + 1][i + 1] + a[i] * a[i + 1] * a[i + 2] //dp[l][j] = dp[i][k] + dp[k + 1][r] + a[l] * a[k + 1] * a[r + 1] } } } int ans = 0; for (int i = 1; i <= n; i++) ans = max(ans, dp[i][i + n - 1]); cout << ans << endl; return 0; }
标签:max scribe out ret str psu 需要 通过 描述
原文地址:https://www.cnblogs.com/HighLights/p/13328429.html