UVA 10003:Cutting Sticks 区间DP
Cutting Sticks
题目链接:
题意:
给出一根木棍,要在木棍上切n下,给出n个切的点的坐标,每次切会把木棍切成两段,需要花费这两段木棍的长度合,求切完这n下的最小花费。
题解:
把这n个点排序,设dp[i][j]为把区间[i,j]内的点都切了的最小花费,跑一边区间DP就好了
代码
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N=55;
const int inf=100000000;
int dp[N][N];
int mmin(int x,int y)
{
return x<y?x:y;
}
int a[N];
void solve()
{
int len,n;
while(~scanf("%d",&len)&&len)
{
scanf("%d",&n);
a[1]=0,a[n+2]=len;
for(int i=2;i<=n+1;++i)
scanf("%d",&a[i]);
sort(a+1,a+n+3);
n+=2;
for(int i=1;i<=n;++i)
{
for(int j=i+1;j<=n;++j)
dp[i][j]=dp[j][i]=inf;
dp[i][i]=dp[i][i+1]=0;
}
for(int l=0;l<=n;++l)
for(int i=1;i+l<=n;++i)
{
int j=i+l;
for(int k=i;k<=j;++k)
{
dp[i][j]=mmin(dp[i][j],dp[i][k]+dp[k][j]+a[j]-a[i]);
}
}
printf("The minimum cutting is %d.\n",dp[1][n]);
}
}
int main()
{
solve();
return 0;
}