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

posted @ 2016-09-05 20:46  kiuhghcsc  阅读(141)  评论(0编辑  收藏  举报