能量项链 NOIP2006提高组 区间dp
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了能量项链 NOIP2006提高组 区间dp相关的知识,希望对你有一定的参考价值。
题目链接
注意状态方程的计算
直接将链拆开,复制一条链,追加在后面,可以模拟环形相关的问题
状态表示:
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示区间
[
i
,
j
]
[i,j]
[i,j]合并的最大值
转移方程:
f
[
l
]
[
r
]
=
m
a
x
(
f
[
l
]
[
r
]
,
f
[
l
]
[
k
]
+
f
[
k
+
1
]
[
r
]
+
a
[
l
]
∗
a
[
k
+
1
]
∗
a
[
r
+
1
]
)
f[l][r] = max(f[l][r],f[l][k]+f[k+1][r]+a[l]*a[k+1]*a[r+1])
f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+a[l]∗a[k+1]∗a[r+1])
#include<bits/stdc++.h>
using namespace std;
const int N = 205;
int n;
int a[N];
int f[N][N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i+n] = a[i];
}
for(int len=1;len<=n;len++)
{
for(int i=1;i+len-1<=2*n;i++)
{
int l = i,r = i + len-1;
for(int k=i;k<r;k++)
f[l][r] = max(f[l][r],f[l][k]+f[k+1][r]+a[l]*a[k+1]*a[r+1]);
}
}
int res = 0;
for(int i=1;i<=n;i++)
res = max(res,f[i][i+n-1]);
cout<<res<<'\\n';
return 0;
}
以上是关于能量项链 NOIP2006提高组 区间dp的主要内容,如果未能解决你的问题,请参考以下文章