zoukankan      html  css  js  c++  java
  • UVa 10003 Cutting Sticks (记忆化搜索)

    题目

    题目描述

    有一根长度为L(L<1000)的棍子,还有n(n<50)个切割点的位置(按照从小到大排 列)。你的任务是在这些切割点的位置处把棍子切成n+1部分,使得总切割费用最小。每次 切割的费用等于被切割的木棍长度。例如,L=10,切割点为2, 4, 7。如果按照2, 4, 7的顺序, 费用为10+8+6=24,如果按照4, 2, 7的顺序,费用为10+4+6=20。

    输入输出格式

    输入格式

    ***

    输出格式

    ***(逃)

    输入输出样例

    输入样例
    100
    3
    25 50 75
    10
    4
    4 5 7 8
    0
    
    输出样例
    The minimum cutting is 200.
    The minimum cutting is 22.
    

    题解

    代表性记忆化搜索,也可区间DP

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=50+5;
    int n,L,a[maxn],vis[maxn][maxn],d[maxn][maxn];
    inline int dp(int i, int j) {
        if(i>=j-1)return 0;
        if(vis[i][j])return d[i][j];
        vis[i][j]=1;
        register int& ans=d[i][j];
        ans=-1;
        for(register int k(i+1); k<=j-1; ++k) {
            register int v(dp(i,k)+dp(k,j)+a[j]-a[i]);
            if(ans<0||v<ans)ans=v;
        }
        return ans;
    }
    int main(int argc,char **argv) {
        while(scanf("%d%d",&L,&n)==2&&L) {
            for(register int i(1); i<=n; ++i)scanf("%d",&a[i]);
            a[0]=0;
            a[n+1]=L;
            memset(vis,0,sizeof(vis));
            printf("The minimum cutting is %d.
    ",dp(0,n+1));
        }
        return 0;
    }
    

    其它

  • 相关阅读:
    1093 Count PAT's(25 分)
    1089 Insert or Merge(25 分)
    1088 Rational Arithmetic(20 分)
    1081 Rational Sum(20 分)
    1069 The Black Hole of Numbers(20 分)
    1059 Prime Factors(25 分)
    1050 String Subtraction (20)
    根据生日计算员工年龄
    动态获取当前日期和时间
    对计数结果进行4舍5入
  • 原文地址:https://www.cnblogs.com/forth/p/9696466.html
Copyright © 2011-2022 走看看