• 【Uva 10003】Cutting Sticks


    Link:

    Description

    给你一根长度为l的棍子;
    然后有n个切割点;
    要求在每个切割点都要切割一下;
    这样,最后就能形成n+1根小棍子了;
    问你怎样切割,消耗的体力最小;
    认为,消耗的体力,为每次切的那根棍子的长度;

    Solution

    在开头增加一个位置0,在结尾增加一个位点L;
    这样,在算长度的时候比较好算一点;
    长度不再是一点一点的了,而是一段一段的;
    (即i..i+1代表了一段);
    设f[i][j]表示,将i..j这一段切掉需要花费的最小体力值;
    则在记忆化搜索中枚举切割点;

    int dfs(int l,int r){
        if (l+1>=r) return 0;//这里如果l+1==r,表示最小的一段木棍
        //不能再切割了;
        int &ans = dp[l][r];
        if (ans!=INF) return ans;
        for (int i = l+1;i <= r-1)
            ans = min(ans,dfs(l,i)+dfs(i,r)+len(l..r));
        return ans;
    }

    输出dfs(1,n+2);

    NumberOf WA

    1

    Reviw

    在赋初值的时候,忘记n加过2了..

    Code

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    #define Open() freopen("F:\rush.txt","r",stdin)
    #define Close() ios::sync_with_stdio(0)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 50;
    
    int l,c[N+10],n;
    int dp[N+10][N+10];
    
    int dfs(int l,int r){
        if (l+1 >= r) return 0;
        int &ans = dp[l][r];
        if (ans!=-1) return dp[l][r];
        rep1(i,l+1,r-1){
            if (ans==-1){
                ans = dfs(l,i) + dfs(i,r) + c[r]-c[l];
            }else
                ans = min(ans,dfs(l,i) + dfs(i,r)+c[r]-c[l]);
        }
        return ans;
    }
    
    int main(){
        //Open();
        //Close();
        while (~scanf("%d",&l) && l){
            rep1(i,1,N+2)
                rep1(j,1,N+2)
                    dp[i][j] = -1;
            scanf("%d",&n);
            rep1(i,2,n+1)
                scanf("%d",&c[i]);
            c[1] = 0,c[n+2] = l;
            n+=2;
            printf("The minimum cutting is %d.
    ",dfs(1,n));
        }
        return 0;
    }
    
  • 相关阅读:
    20180925-6 四则运算试题生成
    20180925-7 规格说明书-吉林市2日游
    20180925-5 代码规范,结对要求
    20180925-2 功能测试
    20180918-2 每周例行报告
    互评Alpha版本
    2017软工 — 每周PSP
    王者荣耀交流协会 — Alpha阶段中间产物
    王者荣耀交流协会第四次Scrum立会
    2017秋软工 —— 本周PSP
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626190.html
Copyright © 2020-2023  润新知