环形石子合并问题(动态规划)(洛谷P1880)
环形石子合并问题(动态规划) 传统的石子合并问题为:有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动相邻的2堆石子合并,合并花费为新合成的一堆石子的数量,求将这N堆石子合并成一堆的总花费最小(或最大)。 这类问题类似区间DP的解法,设dp[i][j]为合并从i到j的最小总花费,那么预处理出前缀和,转移方程为dp[i][j]=max(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]),且i==j时dp[i][j]=0;核心代码为: for(int v = 1; v < n; v++) { for(int i = 0;i < n-v; i++) { int j = i + v; dp[i][j] = INF; int tmp = sum[j] - (i > 0 ? sum[i-1]:0); for(int k = i; k < j; k++) dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + tmp); } } 环形石子合并问题为洛谷P1880 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式: