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;
    }
    


  • 相关阅读:
    那些离不开的 Chrome 扩展插件
    Spring Boot 实战 —— 入门
    Maven 学习笔记
    Linux lvm 分区知识笔记
    Linux 双向 SSH 免密登录
    CentOS Yum 源搭建
    Ubuntu 系统学习
    iOS 测试三方 KIF 的那些事
    Swift 网络请求数据与解析
    iOS Plist 文件的 增 删 改
  • 原文地址:https://www.cnblogs.com/Opaser/p/3662029.html
Copyright © 2011-2022 走看看