[环形 区间 DP] 能量项链

DP知识点整理将同步更新到我的个人博客ohmyfish.net

题目

[环形 区间 DP] 能量项链_fish

思路

和环形石子合并类似,只不过这里的价值费用要用结构体存储。代码基本一样
[环形 区间 DP] 能量项链_i++_02

主要是能把[环形 区间 DP] 能量项链_fish_03处理出来,和前缀和略有不同

代码

// 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;
}