1 条题解
-
0
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 205; // N最大为100,2*100=200,预留空间 long long dp[MAXN][MAXN]; // 用long long避免数值溢出 int a[MAXN]; // 存储珠子的头标记,破环为链后长度为2N int main() { int N; cin >> N; // 输入并破环为链 for (int i = 1; i <= N; ++i) { cin >> a[i]; a[i + N] = a[i]; } // 初始化DP数组为0(单个珠子能量为0) memset(dp, 0, sizeof(dp)); // 枚举区间长度(珠子个数),从2开始 for (int len = 2; len <= N; ++len) { // 枚举左端点,保证右端点不越界 for (int l = 1; l + len - 1 <= 2 * N; ++l) { int r = l + len - 1; // 枚举分割点,更新最大值 for (int k = l; k < r; ++k) { // 强制转换为long long避免中间计算溢出 long long energy = (long long)a[l] * a[k+1] * a[r+1]; dp[l][r] = max(dp[l][r], dp[l][k] + dp[k+1][r] + energy); } } } // 遍历所有长度为N的区间,取最大值 long long ans = 0; for (int i = 1; i <= N; ++i) { ans = max(ans, dp[i][i + N - 1]); } // 输出结果 cout << ans << endl; return 0; }
- 1
信息
- ID
- 1349
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者