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

总目录

在线测评地址(ybt)

在线测评地址(LOJ)

在线测评地址(LUOGU)

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

ybt

通过

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

LOJ

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

LUOGU

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

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

 样例模拟如下:

位次  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;
}

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

上一篇:Linux 内核里的数据结构——基数树


下一篇:力扣--1576.替换所有的问号