import java.util.Arrays;
import java.util.Scanner;
/*UVa 10003 - Cutting Sticks
* 最小矩阵链成类似 状态转移方程 f(i,j) = min {f(i,k) + f(k,j) + (c[j]-c[i])}
* 由于划分阶段比较困难 选择使用记忆化搜索
* */
class Main {
static final int MAX = 55;
int[][] f = new int[MAX][MAX];
int[] c = new int[MAX];
public static void main(String[] args) {
int l;
Scanner scanner = new Scanner(System.in);
Main m = new Main();
while((l = scanner.nextInt()) > 0) {
int n = scanner.nextInt();
for(int i=1; i<=n; i++)
m.c[i] = scanner.nextInt();
m.c[0] = 0;
m.c[n+1] = l;//添加头尾节点
for(int i=0; i<MAX; i++)
Arrays.fill(m.f[i], -1);
System.out.println("The minimum cutting is " + m.dp(0,n+1) + ".");
}
}
private int dp(int i, int j) {
if(j == i+1)
return f[i][j] = 0;//不能再切割
if(f[i][j] != -1)
return f[i][j];
f[i][j] = Integer.MAX_VALUE;
for(int k=i+1; k<j; k++) {
f[i][j] = Math.min(f[i][j], dp(i,k) + dp(k,j) + c[j]-c[i]);
}
return f[i][j];
}
}
UVa 10003 - Cutting Sticks
最新推荐文章于 2020-10-22 19:49:29 发布