UVA - 10003 Cutting Sticks(dp和记忆化搜索两种解法)

UVa 10003 Cutting Sticks 超详细题解(区间DP经典) 题目大意:有一根长l的木棍,有n个切割点要把这根木棍切成n+1段,知道n个切割点的位置。切割一段长度为d的木棍需要的花费为d,如一段长度为10的木棍,有3个切割点:2,5,7,如果按切割点位置从左到右进行切割,所需花费为10+8+5。找出合理的切割顺序使得花费最小。 思路:想明白了就知道是一个很简单的区间DP,这个题刚拿到可能会觉得是贪心把。。。可是在区间dp专题里。。一开始正着想,怎么也找 阅读详情
题目大意:
有一根长度为L的木棍,还有n个切割点的位置(按照从小到大排列)。你的任务是在这些切割点的位置处把木棍切成n+1部分,使得总切割费用最小。每次切割的费用等于被切割木棍的长度。
例如,L = 10,切割点为2,4,7。如果按照2,4,7的顺序排序,费用为10+8+6=24,如果按照4,2,7的顺序,费用为10+4+6=20


解析:
这题有两种解法记忆化搜索和dp,但是状态转移公式只有一个。
设d(i,j)为切割木棍i~j的最优费用,
则d(i,j) = min{d(i,j)+d(k,j) | i<k<j }+a[j]-a[i],

其中最后一项a[j]-a[i]代表第一刀的费用。切完后,木棍变为i~k和k~j两个部分,状态转移方程由此可得。


记忆化搜索

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
const int INF = 0x3f3f3f3f;
int c[N] ,dp[N][N];
int len , n;
int d(int l, int r) {
	if(r - l == 1) {
		return 0;
	}
	if(dp[l][r] > 0) {
		return dp[l][r]; //算过>0,就不要重新再算了
	}
	dp[l][r] = INF;
	for(int i = l; i <= r; i++) {
		dp[l][r] = min( dp[l][r], d(l,i)+d(i,r)+c[r] - c[l]);
	}
	return dp[l][r];
}
int main() {
	while(scanf("%d",&len) != EOF && len) {
		scanf("%d",&n);
		for(int i = 1; i <= n; i++) {
			scanf("%d",&c[i]);
		}
		c[0] = 0;
		c[n+1] = len;
		memset(dp,0,sizeof(dp));
		int ans = d(0, n+1);
		printf("The minimum cutting is %d.\n",ans);
	}
	return 0;
}

dp方法

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1050;
const int INF = 0x3f3f3f3f;
int dp[N][N];
int c[N];
int main() {
	int len, n;
	while( scanf("%d",&len) != EOF && len) {
		scanf("%d",&n);
		for(int i = 1; i <= n; i++) {
			scanf("%d",&c[i]);
		}
		c[0] = 0;
		c[n+1] = len;
		memset(dp,0,sizeof(dp));
		for(int p = 1; p <= n+1; p++) { //枚举区间的长度为 1 ~ n+1
			for(int i = 0; i <= n+1; i++) { //枚举区间的起点为0 ~ n+1
				int j = i+p;
				int mina = INF;
				for(int k = i+1; k < j; k++) { //枚举断点
					mina = min(mina, dp[i][k]+dp[k][j]);
				}
				if(mina != INF) {
					dp[i][j] = mina + c[j]-c[i];
				}
			}
		}
		printf("The minimum cutting is %d.\n",dp[0][n+1]);
	}
	return 0;
}


HC-05蓝牙模块AT指令配置避坑全记录:从配对失败到稳定主从通信 本文详细记录了HC-05蓝牙模块AT指令配置的全过程,从基础认知到主从通信的稳定实现。涵盖了进入AT模式的方法、关键AT指令详解、主从配对流程及常见故障排除,帮助开发者快速掌握蓝牙串口模块的配置技巧,避免常见配对失败问题。 阅读详情

相关推荐

取证实战:当嫌疑人电脑已关机,如何利用EFDD从休眠文件提取BitLocker密钥?

本文详细介绍了如何利用Elcomsoft Forensic Disk Decryptor(EFDD)从休眠文件(hiberfil.sys)中提取BitLocker密钥的实战技术。通过分析休眠文件中的内存快照,取证人员可以突破已关机加密设备的防线,获取关键解密信息。文章涵盖了工具配置、镜像获取、密钥提取及验证等完整流程,并提供了疑难问题解决方案和法律合规建议。

weixin_29315091的博客 345

uva10003 - Cutting Sticks(简单动规)

第一道动规题目,昨天看的题目,今天才做出来,,昨天理解错题意了, 题目说的是绝对切割长度,而不是相对的,请注意。。。 思路: 对切割顺序进行枚举, 对于需要切割的长度【25,50,75】则寻找第一次切割的位置。所以对位置25,50,75各来一次。其实这样还是暴力,只不过表格记录了已经计算过的状态,省时一些罢了。 这里我用的是从底向上递推来填表的 注意这里的小技巧:对于【25,50,75

稻草人 756

信贷审批中的那些坑:从零开始搭建风控策略体系的5个关键步骤

本文深入探讨了信贷审批中的风控策略体系搭建,从数据陷阱识别、规则冲突诊断到反欺诈攻防,提供了5个关键步骤的实战指南。重点解析了如何通过特征工程、决策树优化和模型可解释性技术,构建动态平衡的风控体系,有效降低逾期风险并提升审批效率。

weixin_29253711的博客 414

UVA10003固定点切木棍,怎么切使得每次切之前的木棍长度总和最小

这题,刚开始想了很久没有想到怎么处理,其实如果想通了很简单的, 用d[begin][end]表示从bigin切点到end切点,这段木棍的最省钱切法,然后就模拟切中间各点,计算交给递归下一层。。。 没有后效性,记忆化搜索,子问题重叠,这三个是dp题目的基本要素。 此题,刚好是一个经典的DP题,当然既可以用递推,也可以用记忆化搜索。 有点像矩阵链乘问题,找到状态转移公式就好了dp[

ONE_PIECE的专栏 728

【tensorrt】——深入解析TypeError: pybind11::init()报错:CUDA版本冲突与解决方案

本文深入解析了TensorRT中常见的TypeError: pybind11::init()报错问题,重点探讨了CUDA版本冲突的根源与解决方案。通过实际案例展示了PyTorch与TensorRT的版本兼容性问题诊断方法,并提供了conda环境管理、环境变量配置等实用修复技巧,帮助开发者有效解决CUDA初始化失败问题。

ggg99的专栏 272

433M无线遥控器EV1527协议解码实战:从逻辑分析到代码优化

本文详细解析了433M无线遥控器EV1527协议的实战解码过程。从使用逻辑分析仪抓取波形、理解同步头与数据位编码原理开始,逐步深入代码实现。文章重点对比了原始定时器轮询法的痛点,并提出了基于“边沿捕获+时间戳”的优化方案,构建了高效、可移植且具备抗干扰能力的解码引擎,最后分享了跨平台移植的核心技巧。

weixin_29168813的博客 927

UVA 10003 - Cutting Sticks【DP】

题目大意 思路 代码 Hit题目大意传送门有一根长度为L的木根,还有n个切割的起点(按照从小到大的顺序排列),你的任务是在这些切割点的位置将木根切成n+1部分,使得总切割费用最小。每次切割的费用等于被切割的木根的长度。思路设dp[i][j]为切割木根i~j的最优费用,则dp[i][j] = min{dp[i][k] + dp[k][j]|i<k<j} + a[j] - a[i]; a[j] - a[

100days 337

【Docker】如何让docker容器正常使用nvidia显卡

描述了如何在docker容器中使用英伟达显卡的过程和问题解决方法。

NameLoadingFailed的博客 8372

UVA - 10003Cutting Sticks(递推)

题目:UVA - 10003Cutting Sticks(递推) 题目大意:给根木棍长度l,现在要锯这根木棍,给出n个锯点,求怎样锯才能使得开销最小。例如 长度为10的木棍, 锯点2 4 7,那么如果按照这个顺序 , 首先显示由长度位10的木头先锯了2 ,开销就加10,然后锯完现在有长度为2和8的木棍,现在要在4这个位置锯木头,就是在长度为8的木头上锯4这个位置,这样就加上8,然后又有长

794

IROS 2025机器人技术解析:从诡异设计到硬核应用

机器人技术正从传统的结构化环境应用,迈向复杂非结构化场景的深度交互。其核心原理在于通过仿生设计、多模态感知与智能控制算法,赋予机器人类似生物的适应性与交互能力。这一技术演进的价值在于突破传统机器人在极端环境、精密操作和自然交互中的瓶颈。例如,结合深度强化学习的全身动力学控制,使机器人能在废墟、管道等复杂地形中自主导航;而软体机器人技术则通过材料变形实现安全、柔顺的抓取操作。这些技术最终服务于极端环境巡检、精密装配和高端陪护等刚性应用场景,推动机器人从功能实现迈向与环境、人进行深度、智能交互的新阶段。

weixin_34006468的博客 452

核心面试聚焦:业务问题+系统问题+设计题---字节、阿里、美团等整理统计

业务系统及其他相关面试问题整理:线上相关问题排查+高并发系统的限流+高并发秒杀系统设计+负载均衡+一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M)内快速判断出?

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

UVA 10003 Cutting Sticks 区间DP+记忆化搜索

UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点。每次切割的费用为当前木棍的长度。求切割木棍的最小费用 输入输出 第一行是木棍的长度L,第二行是切割点的个数n,接下来的n行是切割点在木棍上的坐标。 输出切割木棍的最小费用 前话-区间dp简单入门 区间dp的入门下面博客写的非常好,我就是看的他们博客学会的,入...

weixin_30316097的博客 160

GEE数据融合——Landsat (collection 2,level 2 )4、5、7、8、9长时间序列影像数据融合和视频导出分析

长时间序列影像数据融合是指将Landsat影像数据集合2级2(Level 2)中的4、5、7、8和9这五个卫星的数据进行融合。具体来说,这包括将同一地点的多个卫星影像数据进行处理和整合,以产生一个单一的、具有更高质量的影像产品。在长时间序列影像数据融合中,首先需要对不同卫星的影像数据进行校正,以消除不同卫星之间的光谱差异、辐射度问题和几何纠正误差等。然后,通过使用融合算法,将多个卫星的影像数据进行组合,以生成一张全新的、高质量的合成影像。

此星光明博客 1735

UVa 10003 Cutting Sticks

 题目是经典DP,和矩阵相乘的最小乘法次数那个是一样的 f[i,j]=min{f[i,k]+f[k,j]}+j-i (k是i,j之间的木棍切割点) f[0,L]就是答案。由于划分阶段貌似比较困难,于是毫不犹豫的使用记忆化搜索开始的时候f数组开了1000*1000(由于L最大为1000),然后转移状态的时候从把所有的切割点过一遍,复杂度是O(kn^2),k于是提交,居然TLE

个人独立博客http://www.acb0y.cn/ 2028

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

UVA 10003 Cutting Sticks 切木棍 dp

题意:把一根木棍按给定的n个点切下去,每次切的花费为切的那段木棍的长度,求最小花费。 这题出在dp入门这边,但是我看完题后有强烈的既是感,这不是以前做过的石子合并的题目变形吗? 题目其实就是把n+1根木棍合并成一只长木棍,花费为合并后的木棍长度。 于是我很开心地用优先队列敲完代码,wa了。。。 后来发现两个木棍的序号必须是连续的,用优先队列会把序号打乱。每次删减中间的一个数又很费时间,于是

水果君の日常 3198

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

uva 10003- Cutting Sticks (记忆化搜索)

Cutting Sticks  You have to cut a wood stick into pieces. The most affordable company, The Analog Cutting Machinery, Inc. (ACM), charges money according to the length of the stick being cut

Min_lala的专栏 1468

UVA 10003 Cutting Sticks(区间dp)

题目链接:UVA - 10003 Cutting Sticks题意 给一长度为L的棍子,和n个切割点,每次切割的代价为当前的棍子的长度,问最少的总切割代价是多少。 思路 典型的区间dp dp[i][j] = min(dp[i][k]+dp[k][j]+a[j]-a[i]) |i代码递推#include <iostream> #include <algorithm> #include <

YiShi's Blog 1296

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。 输入输出格式 ...

aa445354403的专栏 127

[DP]UVa 10003 Cutting Sticks

记忆化搜索 #include<bits/stdc++.h> #define debug(x) cout<<#x<<" is "<<x<<endl #define fi first #define se second #define pb push_back #define mp make_pair #define DBG 0 //const int N = 1e5 + 5; typedef long long ll; const int INF =

我们仍未知道那天所看见的花的名字。 152

uva 10003 Cutting Sticks 简单区间dp

// uva 10003 Cutting Sticks 区间dp // 经典的区间dp // dp(i,j)表示切割小木棍i-j所需要的最小花费 // 则状态转移为dp(i,j) = min{dp(i,k) + dp(k,j) + a[j]-a[i]) // 其中k>i && k<j // a[j] - a[i] 为第一刀切割的代价 // a[0] = 0,a[n+1] = L; // dp数组初

TIMELIMITE的专栏 1012

UVA 10003 Cutting Sticks

You have to cut a wood stick into pieces. The most affordable company, The Analog Cutting Machinery, Inc. (ACM), charges money according to the length of the stick being cut. Their procedure of work r

Misdom_Tian_Ya的专栏 436

UVA-10003 Cutting Sticks(dp)

可以用记忆化搜索,也可以用递推。 1.记忆化搜索,从[0,l]的状态推到基础状态,用时间很多(660ms) 2.递推,从基础状态,长度慢慢增加,最后推到[0,l] 状态,相对节约时间(500ms) #include&lt;bits/stdc++.h&gt; #define INF 1&lt;&lt;30 #define mxn 1005 using namespace std; int d[mxn...

wrnge的博客 173

【Uva 10003】Cutting Sticks

【Link】: 【Description】 给你一根长度为l的棍子; 然后有n个切割点; 要求在每个切割点都要切割一下; 这样,最后就能形成n+1根小棍子了; 问你怎样切割,消耗的体力最小; 认为,消耗的体力,为每次切的那根棍子的长度; 【Solution】 在开头增加一个位置0,在结尾增加一个位点L; 这样,在算长度的时候比较好算一点;...

AWCXV 101

UVa 10003 - Cutting Sticks

import java.util.Arrays; import java.util.Scanner; /*UVa 10003 - Cutting Sticks * 最小矩阵链成类似 状态转移方程 f(i,j) = min {f(i,k) + f(k,j) + (c[j]-c[i])} * 由于划分阶段比较困难 选择使用记忆化搜索 * */ class Main { static f

annie11640389的专栏 813

UVA - 10003 Cutting Sticks(区间DP)

传送门 此问题类似于最优矩阵链乘,只不过将子问题之间的乘法换成了相互递推的求和 状态转移 设

Happig的博客 245

uva:10003 - Cutting Sticks

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=944 这个题目开始的时候想正向处理,按照给定的点,不断的划分,但是发现状态转移有些小麻烦,就放弃了那种思路,昨天晚上在睡觉之前突然想到,可以逆向处理的,就是将这支树枝先按

BootStar 534
上一篇: UVA 674 Coin Change(完全背包)
下一篇: HDU - 5004 KAMI(回溯+dfs)
HelloWorld10086
博客等级 码龄12年 88粉丝 614原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值