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
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;
}
普及+/提高 习得了什么?想了想,还是区间动规的细节处理吧,相比 石子合并 更上一层。