1570 例题2 能量项链(NOIP2006 LOJ10148 LUOGU1063 普及+/提高) 区间动归 dp 结构体 化圆为线

总目录

在线测评地址(ybt)

在线测评地址(LOJ)

在线测评地址(LUOGU)

1.区间动归 dp 结构体 化圆为线

ybt

通过

测试点结果内存时间
测试点1答案正确624KB2MS
测试点2答案正确636KB4MS
测试点3答案正确640KB2MS
测试点4答案正确660KB2MS
测试点5答案正确672KB2MS
测试点6答案正确704KB2MS
测试点7答案正确744KB2MS
测试点8答案正确776KB2MS
测试点9答案正确840KB2MS
测试点10答案正确872KB2MS

LOJ

LUOGU

 样例模拟如下:

位次  1    2    3      4    5    6    7      8
珠子(2,3)(3,5)(5,10)(10,2)(2,3)(3,5)(5,10)(10,2)


dp[1][2]=2*3*5=30 (2,5)
dp[2][3]=3*5*10=150 (3,10)
dp[3][4]=5*10*2=100 (5,2)
dp[4][5]=10*2*3=60 (10,3)
dp[5][6]=2*3*5=30 (2,5)
dp[6][7]=3*5*10=150 (3,10)
dp[7][8]=5*10*2=100 (5,2)

dp[1][3]=max(dp[1][2]+2*5*10,dp[2][3]+2*3*10)=max(130,210)=210 (2,10)
dp[2][4]=max(dp[2][3]+3*10*2,dp[3][4]+3*5*2)=max(210,130)=210 (3,2)
dp[3][5]=max(dp[3][4]+5*2*3,dp[4][5]+5*10*3)=max(130,210)=210 (5,3)
dp[4][6]=max(dp[4][5]+10*3*5),dp[5][6]+10*2*5)=max(210,130)=210 (10,5)
dp[5][7]=max(dp[5][6]+2*5*10,dp[6][7]+2*3*10)=max(130,210)=210 (2,10)
dp[6][8]=max(dp[6][7]+3*10*2,dp[7][8]+3*5*2)=max(210,130)=210 (3,2)

dp[1][4]=max(dp[1][2]+dp[3][4]+2*5*2,dp[1][3]+2*10*2,dp[2][4]+2*3*2)=max(150,250,222)=250
dp[2][5]=max(dp[2][3]+dp[4][5]+3*10*3,dp[2][4]+3*2*3,dp[3][5]+3*5*3)=max(300,228,255)=300
dp[3][6]=max(dp[3][4]+dp[5][6]+5*2*5,dp[3][5]+5*3*5,dp[4][6]+5*10*5)=max(180,285,310)=310
dp[4][7]=max(dp[4][5]+dp[6][7]+10*3*10,dp[4][6]+10*5*10,dp[5][7]+10*2*10)=max(510,710,410)=710
dp[5][8]=max(dp[5][6]+dp[7][8]+2*5*2,dp[5][7]+2*10*2,dp[6][8]+2*3*2)=max(150,250,222)=250

样例对应的细分区间如下,后来者,或排错有用

lt=1 rt=2 1 1 2 2
lt=2 rt=3 2 2 3 3
lt=3 rt=4 3 3 4 4
lt=4 rt=5 4 4 5 5
lt=5 rt=6 5 5 6 6
lt=6 rt=7 6 6 7 7
lt=7 rt=8 7 7 8 8
lt=1 rt=3 1 1 2 3
lt=1 rt=3 1 2 3 3
lt=2 rt=4 2 2 3 4
lt=2 rt=4 2 3 4 4
lt=3 rt=5 3 3 4 5
lt=3 rt=5 3 4 5 5
lt=4 rt=6 4 4 5 6
lt=4 rt=6 4 5 6 6
lt=5 rt=7 5 5 6 7
lt=5 rt=7 5 6 7 7
lt=6 rt=8 6 6 7 8
lt=6 rt=8 6 7 8 8
lt=1 rt=4 1 1 2 4
lt=1 rt=4 1 2 3 4
lt=1 rt=4 1 3 4 4
lt=2 rt=5 2 2 3 5
lt=2 rt=5 2 3 4 5
lt=2 rt=5 2 4 5 5
lt=3 rt=6 3 3 4 6
lt=3 rt=6 3 4 5 6
lt=3 rt=6 3 5 6 6
lt=4 rt=7 4 4 5 7
lt=4 rt=7 4 5 6 7
lt=4 rt=7 4 6 7 7
lt=5 rt=8 5 5 6 8
lt=5 rt=8 5 6 7 8
lt=5 rt=8 5 7 8 8
710

区间动归 dp 结构体 化圆为线 代码如下:

#include <bits/stdc++.h>
#define maxn 210
using namespace std;
struct node{
	int lt,rt;
}a[maxn];
int dp[maxn][maxn],b[maxn];
int main(){
	int n,i,len,lt,rt,k,mx;
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&b[i]),b[i+n]=b[i];
	for(i=1;i<=2*n;i++)a[i].lt=b[i];
	for(i=1;i<2*n;i++)a[i].rt=b[i+1];
	a[2*n].rt=b[1];
	for(len=1;len<n;len++)
		for(lt=1;lt<2*n;lt++){
			rt=lt+len;
			if(rt>2*n)break;
			for(k=0;k<len;k++){
				dp[lt][rt]=max(dp[lt][rt],dp[lt][lt+k]+dp[lt+k+1][rt]+a[lt].lt*a[lt+k].rt*a[rt].rt);
			}
		}
	mx=0;
	for(i=1;i<=n;i++)mx=max(mx,dp[i][i+n-1]);
	printf("%d\n",mx);		
	return 0;
}

普及+/提高 习得了什么?想了想,还是区间动规的细节处理吧,相比 石子合并 更上一层。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值