码迷,mamicode.com
首页 > 其他好文 > 详细

UVA-10003 Cutting Sticks 动态规划 找分界点k的动规

时间:2018-08-07 20:37:49      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:can   class   过程   turn   sizeof   tick   sub   ring   using   

题目链接: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.\n", dp(0, n+1));
    }

    return 0;
}
Time Memory Length Lang Submitted
150ms 691 C++ 5.3.0 2018-08-06 09:13:55

UVA-10003 Cutting Sticks 动态规划 找分界点k的动规

标签:can   class   过程   turn   sizeof   tick   sub   ring   using   

原文地址:https://www.cnblogs.com/tanglizi/p/9438900.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!