区间dp

区间dp:在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的最优解进而得出整个大区间上最优解的dp算法。
(此句抄袭这里:https://blog.csdn.net/qq_40772692/article/details/80183248)

例题:石子合并

【问题描述】
将n(1≤n≤200)堆石子绕圆形操场摆放,现要将石子有次序地合并成一堆。规定每次只能选相邻的两堆石子合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。选择一种合并石子的方案,使得做n-1次合并,得分的总和最大。
【样例输入】
4
4 5 9 4
【样例输出】
54

解:

1.破环成链

stone[i]=stone[i+n]
stone[1]=4, stone[2]=5, stone[3]=9, stone[4]=4,
stone[5]=4, stone[6]=5, stone[7]=9, stone[8]=4

2.前i堆石子的总和

sum[i]=sum[i-1]+stone[i]
sum[1]=4, sum[2]=9, sum[3]=18, sum[4]=23,
sum[5]=27, sum[6]=32, sum[7]=41, sum[8]=45

3.第i堆与第j堆合并的总和dp[i][j]

dp[i][j]=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]
max_dp[i][j]=max(dp[i][k]+dp[k+1][j])+sum[j]-sum[i-1]

区间长度len=2
4 5 9 4 4 5 9 4
1 2 3 4 5 6 7 8
4 1 0 9
5 2 0 14
9 3 0 13
4 4 0 8
4 5 0 9
5 6 0 14
9 7 0 13
4 8 0
区间长度len=3
4 5 9 4 4 5 9 4
1 2 3 4 5 6 7 8
4 1 0 9 32
5 2 0 14 32
9 3 0 13 30
4 4 0 8 22
4 5 0 9 32
5 6 0 14 32
9 7 0 13
4 8 0

dp[1][3]=dp[1][1]+dp[2][3]+sum(1~3) = 0 +14+(4 +5 +9 ) =32
dp[2][4]=dp[2][3]+dp[4][4]+sum(2~4) = 14+0 +(5 +9 +4 ) =32
……

区间长度len=4=n
4 5 9 4 4 5 9 4
1 2 3 4 5 6 7 8
4 1 0 9 32 54
5 2 0 14 32 *
9 3 0 13 30 *
4 4 0 8 22 *
4 5 0 9 32 *
5 6 0 14 32
9 7 0 13
4 8 0

dp[1][1]+dp[2][4]=0 +32=32
dp[1][2]+dp[3][4]=9 +13=22
dp[1][3]+dp[4][4]=32+0 =32
dp[1][4]=dp[1][1]+dp[2][4]+sum(1~4) = 0 +32+(4 +5 +9 +4 ) =54
……

dp[i][i+n-1],即区间长度为n,中的最大值就是最大总和

参考:https://www.e-learn.cn/content/qita/2729139

posted on 2020-03-02 23:54  HolaWorld  阅读(125)  评论(0编辑  收藏  举报

导航