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.\n",dp[0][t]);
	 }

 return 0;
}


posted @ 2014-03-06 18:11  来自大山深处的菜鸟  阅读(209)  评论(0编辑  收藏  举报