http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=944
区间dp,对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合,求合并后的最优值。
在左右两端加上两个端点,区间dp即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 10000
using namespace std;
const int inf=<<; int l,n;
int c[maxn];
int dp[][]; int main()
{
while(scanf("%d",&l)!=EOF)
{
if(l==) break;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%d",&c[i]);
}
c[]=; c[n+]=l;
memset(dp,,sizeof(dp));
for(int i=; i<=n+; i++)
{
for(int j=; j+i<=n+; j++)
{
int min1=inf;
for(int k=j+; k<j+i; k++)
{
if(min1>dp[j][k]+dp[k][j+i])
{
min1=dp[j][k]+dp[k][j+i];
}
}
dp[j][j+i]=min1+c[j+i]-c[j];
}
}
printf("The minimum cutting is %d.\n",dp[][n+]);
}
return ;
}