区间dp之石子问题
n堆石子(n<= 100),现要将石子有次序地合并成一堆。规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。求最小得分。
记 dp[ i ][ j ] 表示 i 到 j 之间的数合并的最小值。sum[ i ] 表示前缀和。
因此,可以得到式子 dp[ i ] [ j ] = min ( dp[ i ][ j ] , dp[ i ][ k ] + dp[ k+1 ][ j ] + sum[ j ] - sum[ i-1 ] );
此时复杂度为n的三次方,可用平行四边形优化减小复杂度
p[i][i]=i;//记录i与j之间的最优k值
for(int len=2;len<=n;len++)
{
for(int i=1;i+len-1<=n;i++)
{
int j=i+len-1;
for(int k=p[i][j-1];k<=p[i+1][j];k++)
{
int val=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1];
if(val<dp[i][j])
{
dp[i][j]=val;
p[i][j]=k;
}
}
}
}
//最优解为dp[1][n]
ccf压缩编码也是运用该算法http://118.190.20.162/view.page?gpid=T49。

浙公网安备 33010602011771号