zoukankan      html  css  js  c++  java
  • UVA-10003 Cutting Sticks 动态规划 找分界点k的动规

    题目链接:https://cn.vjudge.net/problem/UVA-10003

    题意

    有根棍子,上面有些分割点(n<50),每次按分割点切割棍子时,费用为当前棍子的长度。
    问有什么样的顺序,使总费用最小。

    思路

    简单题,设dp[i][j]为在分割点ij之间棍子的最小切割费用。
    有转移方程dp[i][j]=min( dp[i][k]+dp[k][j] )+pos[j]-pos[i]
    注意边界条件dp[i][i+1]=0意思是i~i+1之间不需要切割费用。

    提交过程

    WA 边界条件给错
    WA 输出错
    AC

    代码

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn=50+20, INF=0x3f3f3f3f;
    int n, l;
    int pos[maxn], data[maxn][maxn];
    int dp(int l, int r){
        if (r<=l+1) return 0;
        if (data[l][r]) return data[l][r];
    
        data[l][r]=INF;
        for (int k=l+1; k<r; k++)
            data[l][r]=min(data[l][r], dp(l, k)+dp(k, r));
        return data[l][r]+=pos[r]-pos[l];
    }
    
    int main(void){
        while (scanf("%d", &l)==1 && l){
            memset(data, 0, sizeof(data));
            scanf("%d", &n);
            pos[0]=0; pos[n+1]=l;
            for (int i=1; i<=n; i++)
                scanf("%d", &pos[i]);
            printf("The minimum cutting is %d.
    ", dp(0, n+1));
        }
    
        return 0;
    }
    
    
    Time Memory Length Lang Submitted
    150ms 691 C++ 5.3.0 2018-08-06 09:13:55
  • 相关阅读:
    逗号操作符使用小技巧
    字符解码?
    画图 wx.Window pen
    进程和线程
    内存管理
    简单的文本编辑器
    迭代器 Iterator
    文件操作
    ebay api学习
    一,wxpython入门
  • 原文地址:https://www.cnblogs.com/tanglizi/p/9438900.html
Copyright © 2011-2022 走看看