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

    其它

  • 相关阅读:
    (转)当你输入一个网址,实际会发生什么?
    Word Ladder II
    Jump Game II
    Candy
    [生成树][Uva1395][Slim Span]
    [AC自动机][HDU3065]
    [KMP求最小循环节][HDU3746][Cyclic Nacklace]
    [扩展KMP][HDU3613][Best Reward]
    [Manacher][HDU3613][Best Reward]
    [KMP][HDU3336][Count the string]
  • 原文地址:https://www.cnblogs.com/forth/p/9696466.html
Copyright © 2020-2023  润新知