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