区间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,中的最大值就是最大总和