Cutting Sticks(区间DP)
Cutting Sticks
题意:给一个0-L长度的木板,然后给N个数,表示0-L之间的某个刻度,最后要用刀把每个刻度都切一下 使其断开,然后每次分裂的cost是分裂前的木板的长度。求整个分开之后的最小cost。
题解:
区间DP 设dp[i][j]为切割小木棍i~j的最小花费。则dp[i][j]=min(dp[i][k]+dp[k][j])+a[j]-a[i];(i<=k<=j)其中a[j]-a[i]表示的是切第一刀的花费。注意,相邻的两个切点间的dp值为0。
1 import java.util.Scanner;
2
3 public class Main {
4 static int l;
5 static int [][] dp = new int [55][55];
6 static int [] a = new int [55];
7 public static void main(String[] args) {
8 Scanner cin = new Scanner(System.in);
9 while(cin.hasNext()) {
10 l = cin.nextInt();
11 if(l==0)
12 break;
13 for(int i=0;i<52;i++) {
14 for(int j=0;j<52;j++) {
15 dp[i][j] = 1000000;
16 }
17 }
18 int n = cin.nextInt();
19 for(int i=1;i<=n;i++) {
20 a[i] = cin.nextInt();
21 }
22 a[0] = 0;
23 a[n+1] = l;
24 for(int i=0;i<=n;i++) {
25 dp[i][i+1] = 0;
26 }
27 for(int len=1;len<=n+1;len++) {
28 for(int left=0;left+len<=n+1;left++) {
29 int right = len+left;
30 for(int k=left+1;k<=right;k++) {
31 dp[left][right] = Math.min(dp[left][k]+dp[k][right]+a[right]-a[left],dp[left][right] );
32 }
33 }
34 }
35 System.out.println("The minimum cutting is "+dp[0][n+1]+".");
36 }
37 }
38 }
39