Cutting Sticks(区间DP)

Cutting Sticks

 UVA - 10003 

题意:给一个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  

 

posted @ 2019-02-20 16:38  *starry*  阅读(186)  评论(0编辑  收藏  举报