题目来源是noip2016提高组T1。题目意思看一遍就能明白。也是卡了几个地方- -。一开始枚举的l和r但因为题目比较特殊不太好实现,就舔了个题解枚举了len和l。要注意第二个for的判断条件是
l + len - 1 < n + n
状态转移方程也挺简单的。f[l][r] = max(f[l][r], f[l][k] + f[k + 1][r] + w[l] * w[r + 1] * w[k + 1]);。因为要从k处连接,所以乘w[k + 1]。
完整的代码↓
/*
作者:Ksyer
题目:p1154 能量项链
*/
#include <cstdio>
#include <algorithm>
using namespace std;
long long n, f[305][305], w[10005], ans;
int main() {
scanf("%lld", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &w[i]);
w[n + i] = w[i];
}
for(int len = 2; len <= n; len++)
for(int l = 1; l + len - 1 < n + n; l++) {
int r = l + len - 1;
f[l][r] = -1;
for(int k = l; k < r; k++)
f[l][r] = max(f[l][r], f[l][k] + f[k + 1][r] + w[l] * w[r + 1] * w[k + 1]);
}
for(int i = 1; i <= n; i++)
ans = max(ans, f[i][i + n - 1]);
printf("%d", ans);
return 0;
}