能量项链(NOIP2006)

第一次做的时候方程是对的,但就是没有AC
f[l][r]=max{f[l][k]+f[k][r]+a[l]*a[k]*a[r]|l<k<r}

r=l+i,f[l][r]表示从l到r共r-l+1=i+1颗珠子聚合后可以获得的最大能量

翻了两篇题解发现,问题出在把环拆成链时没有把链再存一遍

还有就是在循环的时候第一个循环,i不是1n,而是2n+1因为打断的是中间的

方程变形:区间dp公式:f[i][j]=max{f[i][k]+f[k+1][j]+决策}

之前我套公式套傻了写成f[l][k]+f[k+1][r]+a[l]*a[k]*a[r]

*事实上k并不用+1,因为题意是说相邻两个珠子合并,k是第一个珠子的尾标记和第二个珠子的头标记,他们是同一个数字

AC代码:

#include<iostream>
using namespace std;
int n,ans,f[210][210],a[210];
int main()
{
	cin>>n;
	for(int i=1; i<=n; i++)
	{
		cin>>a[i];
		a[n+i]=a[i];
	}
	for(int i=2; i<=n+1; i++)//注意i的循环头尾
	{
		for(int l=1; l+i-1<=2*n;l++)//注意链是到2n
		{
			int r=l+i-1;
			for(int k=l+1;k<=r-1;k++)//k位于lr之间
			{
				f[l][r]=max(f[l][r],f[l][k]+f[k][r]+a[l]*a[k]*a[r]);//套公式
				ans=max(ans,f[l][r]);
			}
		}
	}
	cout<<ans;
	return 0;
}
posted @ 2020-01-20 10:45  Winter_Misty  阅读(236)  评论(0编辑  收藏  举报