zoukankan      html  css  js  c++  java
  • uva10003

    /*
    2014.3.6
      这题说的是给你了一根木棒 然后 n 个点(线段上的点) 
      然后计算 在这 n个点上都切下去的 最小花费 
      举个例子 
      100
      3
      25 50 75
      如果 从 25 开始切 然后切 50  75  则花费是 100 + 75 +50= 225
      如果 从 50 开始切 然后切 25   75  则花费  100 +50 +50 =200
      相对 更优一些
       解题: 可以发现 当 从某个点坐标为 D 切下去后则从0到D的 部分和从 D到 I 的 部分就没有了关系 
       因此 得到状态转移的 公式 
       dp[i][j]=min(dp[i][k]+dp[k][j]);
       得解
    */
    
    #include<cstdio>
    #include<string.h>
    #include<iostream>
    using namespace std;
    int dp[100][100];
    int W[100];
    int main()
    {
         int N,i,j;
    	 W[0]=0;
    	 while(scanf("%d",&N)==1&&N!=0){
    	     int t;
    		 
    		 scanf("%d",&t);W[t+1]=N;
             for( i=1;i<=t;i++)
    		 {  
    			 scanf("%d",&W[i]);
    			 dp[i-1][i]=W[i]-W[i-1];
    		 }
    		 t++;
    		 dp[t-1][t]=W[t]-W[t-1];
    		 for(i=0;i+2<=t;i++)
    			       dp[i][i+2]=dp[i][i+1]+dp[i+1][i+2];
    		 for(i=0;i+1<=t;i++) dp[i][i+1]=0;
    		 
    		 
    		 for(int k=3;k<=t;k++)
    		
    			 for(i=0;i+k<=t;i++)
    			 {
    			    int c=i+k;
    			    
    				dp[i][i+k]=10000000;
    				
    				for(int j=i+1;j<c;j++)
    				
    					if(dp[i][c]>(dp[i][j]+dp[j][c]+W[c]-W[i])){
    					
    						dp[i][c]=dp[i][j]+dp[j][c]+W[c]-W[i];
    					}
    			     
    			 }
    	
    		 printf("The minimum cutting is %d.
    ",dp[0][t]);
    	 }
    
     return 0;
    }
    


  • 相关阅读:
    20200816
    20200815
    20200813
    20200811
    20200810
    20200806
    20200804
    20200803
    20200802
    20200801
  • 原文地址:https://www.cnblogs.com/Opaser/p/3662029.html
Copyright © 2011-2022 走看看