您的位置:首页 > 其它

NOIP 2006提高组 能量项链

2017-08-12 18:29 169 查看
经典环形dp问题

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

int lenght=0,DG[2005][2005]={0};
int li[2005][2]={0};
int DP(int lf,int rt);

int main(void)
{
cin>>lenght;
for(int i=1;i<=lenght;i++)
{
cin>>li[i][0];
if(i!=1)li[i-1][1]=li[i][0];
}
li[lenght][1]=li[1][0];
for(int i=lenght+1;i<=lenght*2-1;i++)
{
li[i][0]=li[i-lenght][0];
li[i][1]=li[i-lenght][1];
}
int ans=0,t=0;
for(int i=1;i<=lenght;i++)
{
t=DP(i,i+lenght-1);
ans=max(t,ans);
}
cout<<ans<<endl;
return 0;
}

int DP(int lf,int rt)
{
if(DG[lf][rt]!=0)return DG[lf][rt];
if(rt==lf+1)return li[rt][0]*li[rt][1]*li[lf][0];
int tot=0,as=0;
for(int i=lf;i<rt;i++)
{
tot=DP(lf,i)+DP(i+1,rt)+(li[lf][0]*li[i+1][0]*li[rt][1]);
as=max(tot,as);
}
DG[lf][rt]=as;
return as;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp