【题解】 这是一道很经典的动态规划题,出现了很多次,今天终于把它弄明白了,
参考博客:http://http://blog.csdn.net/metaphysis/article/details/6872560
【AC代码】
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=55;
#define INF 0x3f3f3f3f
int length,num,a[N];
int dp[1005][1005];
int cust(int start,int end)
{
if(dp[start][end]<INF)
return dp[start][end];//这说明已经有了最小花费 直接返回即可
for(int i=(start+1);i<=(end-1);i++)//注意不是从0到end
{
int ss = cust(start,i)+cust(i,end);//递归的去求最小花费
ss += (a[end]-a[start]) ;
if(ss < dp[start][end])
dp[start][end]=ss ;
}
return dp[start][end];
}
int main()
{
while(~scanf("%d",&length),length)
{
scanf("%d",&num);
for(int i=1;i<=num;i++)
scanf("%d",&a[i]);
}
a[num+1]= length;//末端长度为整个木棒长
int money=0;
if(num)
{
for(int i=0;i<=55;i++)
for(int j=0;j<55;j++)
dp[i][j]=INF;//初始化花费无穷大
for(int i=0;i<=num;i++)
dp[i][i+1]=0;//相邻的结点不用切割
cust(0,num+1);//加入两个端点
money = dp[0][num+1];//整个长度的min花费
}
printf("The minimum cutting is %d.\n",money);
}
return 0;
}