UVa10003 Cutting Sticks

本文介绍了一个简单的动态规划问题,通过记忆化搜索解决区间切割问题,实现寻找最小切割成本的算法。状态数量为O(L^2),决策数量为O(n),整体时间复杂度为O(L^2n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目描述
这里写图片描述


也是比较简单的dp
f(l,r)为切l~r段的最小花费.
f(l,r)=min(f(l,k)+f(k,r))+rl(l<k<r) 其中k为可切的点。
边界是f(l,r)=0([l,r])
答案是f(0,L)
状态有O(L2)个,决策有O(n)
时间复杂度O(L2n)
我觉得用记忆化搜索较好。
代码

#include<cstdio>

#include<iostream>

#include<cstring>

#include<algorithm>

#include<cstdlib>

using namespace std;

int f[1010][1010],c[60],n,l;

const int INF=100000000;

int dp(int l,int r){

    int& ans=f[l][r];

    if(ans>-1) return ans;

    ans=INF;

    for(int i=0;i<n;i++) if(c[i]>l&&c[i]<r) ans=min(ans,dp(l,c[i])+dp(c[i],r)+r-l);

    return ans==INF?ans=0:ans;

}

int main(){

    while(cin>>l&&l){

        cin>>n;

        memset(f,-1,sizeof(f));

        for(int i=0;i<n;i++) scanf("%d",&c[i]);

        printf("The minimum cutting is %d.\n",dp(0,l));

    }

    return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值