能量项链 hrbustoj 1376 区间dp

题意:类似于lrj白书中的矩阵链成,但唯一不同的是现在他是一个环,顺时针,而之前的是链,所以用循环dp,思路就是重新的给d【i】【j】(i>j)也赋予值,从i到j的最大值,之前就不存在这种情况(*****重点)。

d[i][j]=max(d[i][j],d[i][k]+d[(k+1)%n][j]+a[i]*a[(k+1)%n]*a[(j+1)%n]);。

题目:点击打开链接

#include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b
int a[1010];
int d[1010][1010];
int main()
{
	int i,j,k,m,n,p,t,cn,cnt;
	while(scanf("%d",&n)!=EOF)
	{
		memset(d,0,sizeof(d));
		for(i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
		}
		for(i=0;i<n;i++)
		{
			d[i][(i+1)%n]=a[i]*a[(i+1)%n]*a[(i+2)%n];	
		}
		//for(t=0;t<n;t++)
		t=0;
		for(p=2;p<n;p++) //间隔
		{
			for(cn=0,i=t;cn<n;i++,cn++)  
			{
				i%=n;
				j=(i+p)%n;
				//if(j>n)
				//break;
				for(cnt=0,k=i;;k++,cnt++) //注意这儿只要到j就可停止,不可执行n-1次,我之前错过这
				//for(k=i;k<j;k++)
				{
					k%=n;
					if(k==j)
					break;
					d[i][j]=max(d[i][j],d[i][k]+d[(k+1)%n][j]+a[i]*a[(k+1)%n]*a[(j+1)%n]);
				}
			}	
		}
		//printf("%d %d\n",d[0][2],d[0][3]);
		t=0;
		for(i=0;i<n;i++)
		{
			t=max(d[i][(i+n-1)%n],t);
		}
		printf("%d\n",t);
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值