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;
}


微信小程序一键登录和临时code用JWT进行微信用户授权 2、跨域进行调用接口时候,唯一标识UnionID和会话密钥 session_key如果还是用的我自己的,会出现无法调用微信服务器接口,就需要将唯一标识和会话密钥换成前端的,才可以,我自己认为这样很不合理,暂时还没有找到原因。2、能够获取到openId,但是也只能获取到openid,无法获取用户的相关信息,经过查阅官网发现,现在微信那边已经将用户信息加密,需要调用提供的接口进行解密然后获取用户数据,问题原因已经找到解决方法,还未即使更改。1、我这是一台电脑实现的前端调用后端接口,不用考虑跨域的问题。 阅读详情

相关推荐

GlobalMapper地形对比与方量计算实战:从两期数据到填挖方区域精准提取

本文详细介绍了使用GlobalMapper进行地形对比与方量计算的实战方法,从两期数据准备到填挖方区域精准提取。通过三步核心操作和实用技巧,帮助工程师高效完成土方平衡分析,提升工程预算精度。特别适用于河道整治、湿地修复等工程项目,大幅减少人工计算误差和时间成本。

weixin_28698059的博客 221

uva10003 - Cutting Sticks(简单动规)

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

稻草人 756

80、编程学习资源与x86知识全解析

本文详细介绍了编程学习中多个领域的优秀书籍和博客资源,涵盖逆向工程、C/C++、x86/x86-64架构、ARM、汇编语言、Java、UNIX、密码学等多个方向。同时,深入解析了x86架构的核心知识,包括术语、通用寄存器、FPU寄存器、SIMD寄存器、调试寄存器以及常用指令的使用方法和操作步骤。通过本文,读者可以系统地掌握底层编程知识,并应用于逆向工程、系统开发和性能优化等领域。

tree的博客 221

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

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

ONE_PIECE的专栏 728

SAP Fiori Elements 扩展实战:UI 层扩展、OData 服务扩展、CDS 视图增强及全流程案例

UI 层扩展主要关注在不修改标准生成界面的基础上,自定义用户界面元素和交互逻辑。典型需求包括:在现有 Fiori Elements 界面上添加新的字段(如表格列或表单项)、增加自定义按钮并绑定操作、以及通过控制器扩展加入事件处理等。无论在 RAP 还是传统 BOPF 架构下,前端 UI 扩展通常采用 SAPUI5 提供的**扩展点(Extension Points)和控制器扩展(Controller Extension)**机制来安全地插入自定义代码。下面分别说明两种后端架构下 UI 扩展的实现方式。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 904

CDD数据库文件制作(三)——服务配置(0x10)

根据诊断调查表进行每一步配置的详细操作,与背后逻辑解释 1.会话切换配置 1.1.根据诊断调查表进行信息提取(0x1001) 1.2.会话转换配置(0x1001) 1.3.根据诊断调查表进行信息提取(0x1002) 1.4.会话转换配置(0x1002) 1.5.根据诊断调查表进行信息提取(0x1003) 1.6.会话转换配置(0x1003) 1.7.会话切换配置完成后效果图 2.安全等级配置信息提取 2.1.安全访问配置(0x1001) 2.2.安全访问配置(0x1002) 2.3.安全访问配置(0x100

LOVE135149的博客 5840

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

【AUTOSAR-COM】-5.2-“Deadline Monitoring超时监控”-2-基于IPdu实现

目录 1 在CFG中配置Deadline Monitoring超时监控 1.1 参数说明 1.2 生成代码差异 2 通过一段测试代码看Deadline Monitoring超时监控 3 使用CAN盒观察Deadline Monitoring实际测试效果 3.1 Case 1:ECU开始工作时,没有收到Frame 3.2 Case 2:ECU工作中,接收的Frame丢失、 4 小结 5 结尾 关键字: DM=Deadline Monitoring超时监控 ComFirstTime...

「汽车电子助手」的博客 1788

UVA - 10003Cutting Sticks(递推)

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

794

024、反激变换器的短路保护设计

本文详细探讨了反激变换器短路保护的设计要点与实践经验。作者通过实际案例分析了短路时反激拓扑的电流特性,指出初级峰值电流限制是最基础的保护手段,但需配合打嗝模式使用。文章重点剖析了打嗝模式设计的三个关键陷阱:频率设定、退出条件和软启动衔接。同时强调次级侧辅助保护、变压器参数优化、环路响应协调的重要性,并比较了自恢复与锁死方案的适用场景。最后提出实测验证的四个关键点和设计经验:不盲信芯片手册、保护电路独立设计、充分留有余量、进行破坏性测试。全文以工程实践为导向,为反激电源的可靠短路保护提供了系统性解决方案。

Jack010169的博客 242

CKS-CN考试之路----04

根据上面信息我们知道,这个pod运行在default命名空间下,pod名字为cpu-77cd5ddcbf-bvb8w。可以从/etc/falco/falco_rules.yaml中获得相关内容,大概在文件的460行左右.编辑/etc/falco/falco_rules.local.yaml。7c688a8bfd69即是我们想要获得的docker id。将行为不当 Pod 的 Deployment 缩放为零副本。根据我们刚才定义的rule生成报告。访问/dev/mem 的 Pod。那么如果考试记不住怎么办?

Q先生 603

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

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

weixin_30316097的博客 160

【ESP32使用MAX98357播放音频】

在物联网和智能家居领域,音频播放功能越来越受到重视。ESP32作为一款功能强大的微控制器,结合MAX98357音频放大器模块,可以实现高品质的音频播放。本文将详细介绍如何使用ESP32的I2S接口通过MAX98357进行音频播放。

vor234的博客 7529

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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、付费专栏及课程。

余额充值