【题目网站】
【题目考点】
区间动态规划
【题目思路】
- 输入数组,把长度翻倍
- 一个一个区间地填
- 找出最大值与最小值
- 输出答案
【思路讲解】
这道题是一道区间动态规划的练习,可以直接用区间动态规划的方法来做,只是要记得运算规律(m * r * n)
不会区间动态规划的同学,可以看我的另一篇博客,再刷一道模板题:P1880 [NOI1995] 石子合并_罗门永存的博客-CSDN博客
动态转移公式是:max(f[i][j], p[i] * p[k + 1] * p[j + 1] + f[i][k] + f[k + 1][j])(i为起始点,j为结束点,k为分割点)
【题目答案】
#include <iostream>
#include <cmath>
using namespace std;
const long long N = 105 * 4;
int f[N][N], p[N], ans, n;
int main(){
cin >> n;
for (int i = 1; i <= n; i++){
cin >> p[i];
p[i + n] = p[i];
}
for (int l = 2; l <= n; l++)
for (int i = 1; i <= n * 2; i++){
int j = i + l - 1;
for (int k = i; k < j; k++)
f[i][j] = max(f[i][j], p[i] * p[k + 1] * p[j + 1] + f[i][k] + f[k + 1][j]);
if (j - i == n - 1)
ans = max(ans, f[i][j]);
}
cout << ans << endl;
return 0;
}
【常见错误】
第18行p[j + 1]没有+1
(如有错误请及时通知,我会第一时间修改)
(此博客为另一个号的修订版)