[环形 区间 DP] 能量项链
Posted 鱼竿钓鱼干
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[环形 区间 DP] 能量项链相关的知识,希望对你有一定的参考价值。
[环形 区间 DP] 能量项链
DP知识点整理将同步更新到我的个人博客ohmyfish.net
题目
思路
和环形石子合并类似,只不过这里的价值费用要用结构体存储。代码基本一样
f
[
l
]
[
r
]
=
f
[
l
]
[
k
]
+
f
[
k
+
1
]
[
r
]
+
+
b
e
a
d
[
l
]
.
s
t
∗
b
e
a
d
[
k
]
.
e
d
∗
b
e
a
d
[
r
]
.
e
d
f[l][r]=f[l][k]+f[k+1][r]++bead[l].st*bead[k].ed*bead[r].ed
f[l][r]=f[l][k]+f[k+1][r]++bead[l].st∗bead[k].ed∗bead[r].ed
主要是能把 b e a d [ l ] . s t ∗ b e a d [ k ] . e d ∗ b e a d [ r ] . e d bead[l].st*bead[k].ed*bead[r].ed bead[l].st∗bead[k].ed∗bead[r].ed处理出来,和前缀和略有不同
代码
// Problem: P1063 [NOIP2006 提高组] 能量项链
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1063
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// FishingRod
#include<bits/stdc++.h>
using namespace std;
#define endl "\\n"
typedef long long LL;
typedef pair<int,int> PII;
//#define MULINPUT
/*DATA & KEY
*/
int T;
const int N=405;
LL a[N],f[N][N],s[N];
struct Bead{LL st,ed;}bead[N];
LL work(int l,int r)
{
if(f[l][r])return f[l][r];
if(l==r)return 0;
LL tmp=0;
for(int k=l;k<r;k++)
tmp=max(tmp,work(l,k)+work(k+1,r)+bead[l].st*bead[k].ed*bead[r].ed);
return f[l][r]=tmp;
}
void solve(int C)
{
//NEW DATA CLEAN
//NOTE!!!
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
{
if(i==n)bead[i]={a[i],a[1]};
else bead[i]={a[i],a[i+1]};
}
for(int i=n+1;i<=2*n;i++)
bead[i]={bead[i-n].st,bead[i-n].ed};
LL ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,work(i,i+n-1));
cout<<ans;
}
int main()
{
#ifdef MULINPUT
scanf("%d",&T);
for(int i=1;i<=T;i++)solve(i);
#else
solve(1);
#endif
return 0;
}
以上是关于[环形 区间 DP] 能量项链的主要内容,如果未能解决你的问题,请参考以下文章