zoukankan      html  css  js  c++  java
  • UVA-10003 Cutting Sticks (区间DP)

    题目大意:将一段长为L的木棒在给定的n个切割点切开,每切一次的花费等于当前木棒的长度。求切成n+1段的最小花费。

    题目分析:区间DP。定义dp(i,j)表示切割区间i~j的花费,则 f(i,j)=min(f(i,k)+f(k,j))+dist(i,j)。时间复杂度为n3

    代码如下:

    # include<iostream>
    # include<cstdio>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    const int INF=100000000;
    int a[55],dp[55][55],n;
    void DP()
    {
        for(int l=0;l<=n+1;++l){
            for(int i=0;i+l<=n+1;++i){
                int r=i+l;
                dp[i][r]=INF;
                if(l==0)///l为0说明现在是第一刀。
                    dp[i][r]=a[n+1]-a[0];
                if(l==1)///l为1说明现在不用切割。
                    dp[i][r]=0;
                for(int k=i+1;k<r;++k)
                    dp[i][r]=min(dp[i][r],dp[i][k]+dp[k][r]+a[r]-a[i]);
            }
        }
    }
    int main()
    {
        int l;
        while(scanf("%d",&l)&&l)
        {
            scanf("%d",&n);
            a[0]=0;
            for(int i=1;i<=n;++i)
                scanf("%d",a+i);
            a[n+1]=l;
            sort(a,a+n+2);
            DP();
            printf("The minimum cutting is %d.
    ",dp[0][n+1]);
        }
        return 0;
    }
    

      

  • 相关阅读:
    c++ stl string char* 向 string 转换的问题
    不要在疲惫中工作
    今天
    悠然自得
    忙与闲
    <转>LuaTinker的bug和缺陷
    匿名管道
    SetWindowHookEx 做消息响应
    最近工作
    实现网页页面跳转的几种方法(meta标签、js实现、php实现)
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4790077.html
Copyright © 2011-2022 走看看