UVA - 10003 - Cutting Sticks
原命题链接:PDF/Vjudge
题目的意思是:告诉木棍的总长度,切点个数,和切点位置。每次切割花费的力气为切割的木棍的长度,求出最小花费的力气值。
还没怎么开始看dp,一开始看这道题目,想起了做过的一道拼接木块的题目,是用贪心AC的,本以为倒着写过去就完事,但是测试数据的时候发现,我去,差距太大了哦。后来一阵计算反思:贪心做不对,要动态规划。(贪心只能过样例)
没专业加仔细学习过动态规划的我,连蒙加猜加上数据找错,最后上交终于半夜AC,刚想一阵狼嚎马上闭住嘴了。
先放上代码兴奋一下:
#include <bits/stdc++.h> using namespace std;
int a[500], dp[100][100]; int dps(int left, int right)
{ if (dp[left][right] >= 0) return dp[left][right]; if (right - left == 1) return 0; int minx = 0xFFFFFFF; for (int k = left + 1; k < right; k++) { minx = min(minx, dps(left,k) + dps(k,right) + a[right] - a[left]); //cout << a[left] << " " << a[k] << " " << a[right] << " " << minx << endl;//测试的时候用的 } return dp[left][right]= minx;
} int main()
{ int length; while (cin >> length && length) { memset(a, 0, sizeof(a)); memset(dp, -1, sizeof(dp)); int cnt; cin >> cnt; for (int i = 1; i <= cnt; i++) cin >> a[i]; a[cnt + 1] = length; int ans = dps(0, cnt+1); cout << "The minimum cutting is "; cout << ans << "." << endl; /*for (int i = 0; i < 5; i++)//测试的时候用的 { for (int j = 0; j < 5; j++) cout << " " << dp[i][j]; cout << endl; }*/ } system("pause"); return 0;
}
思路重现:(大佬勿喷)一段木头,已知切点(我们可以把两头的位置也看作切点),我们要切割的话,如果只有一个切割点的话,是好求解的,我们可以用右端点减去左端点就得到花费的力气值,但是如果有多段呢?这里想到可以用二维数组的下标来的表示左切点和右切点来记录切割某一段区间的力气值。那么如果有多个切点呢,我们可以通过递归来找到某一段间隔区间的切割的力气值,如果没有储存当前区间,说明他要么是中间没有多余切点的切点(直接右端点减去左端点),要么是还没有计算(继续递归),这样的话,就可以得到每两个区间上的切割的最小力气值。最终的数值都是基于每一个区间上的最小的力气值,这样最后也是最小的力气值。采用递归的方式,一开始相当于最先着眼于每两个相邻的切点(最后一层递归终止),然后逐步扩大视野(到达上层递归),求出整个区间的力气值。
搬出一组(改了很久的)数据给自己以后看:
10
3
1 5 9
5 9 10 5
1 5 10 14
1 5 9 8
1 9 10 14
0 1 10 24
0 1 5 5
0 5 10 20
0 1 9 17
0 5 9 14
0 9 10 20
The minimum cutting is 20. -1 -1 5 14 20 -1 -1 -1 8 14 -1 -1 -1 -1 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
下面是最后打出来的表(可能是这么叫。。。)
通过上面的思路应该可以看得出来
上方的输出就是切割某两个存在中间切点的切点的时候花费的最小力气值:
5 9 10 5 就是说, 从5-10在9处切点切割开来,花费的最小力气值是5.
1 5 10 14就是说, 从1-10在5切割开来花费的最小力气值是14,
怎么来的呢:1-10上有两个切点,要在5切开,这个时候的力气值肯定会有10-1=9,就是切割5花费的力气,
然后还需要5-10的力气值,上一行已经算出来了
就是5,加起来就是14.以此类推··· ···
最后
1.在写的时候一开始不是很严谨,定义minx的时候没有定义很大,导致出错,后来定义了一个大数就好了。
2.还有就是一开始没保存结果,就是没有dp那个数组,一直超时,后来才加上用数组下标来表示切点,减少递归次数。
UVA - 10003 - Cutting Sticks相关推荐
- uva 10003——Cutting Sticks
题意:给定一长为L的木棍和n个切割点,每次切割的费用为切割的长度,求最小的费用. 思路:dp,子问题是区间(i,j)的最小费用,临界是(i,j)只有一个切割点.dp[i,j]=min(dp[i,k]+ ...
- UVA 10003 Cutting Sticks (区间dp)
题意: 给你一根木块,让你在n个点切块(不能改变顺序),使得总花费最小,看拿来切的那根木棍的长度. 代码: #include <map> #include <set> #inc ...
- UVA 10003 Cutting Sticks
大意:确定切割木棍的次序, 代价为当前木棍长度,使得切割的总的代价最小. 思路:我想了很久,后来发现状态转移方程可以这样表示:d[i][j] = min(d[i][j], d[i][k]+d[k][j ...
- UVa 10003 - Cutting Sticks
记忆化搜索.还有递归调用.大概题意就是一根木棍的长度length,按他所给的点切割.求最大的价值. X , Y 表示 X点到Y点的.转移方程vis[X][Y] = min ( DP[X][i] + D ...
- Cutting Sticks UVA - 10003
题解:dp[ i ][ j ]=min { dp[ i ][ k ]+dp[ k ][ j ] }+a[ j ]-a [i ]. 和石子归并是一样的问题,枚举区间的长度,然后更新这个区间的值. 1 # ...
- UVA10003 切木棍 Cutting Sticks(区间DP、细节)
整理的算法模板合集: ACM模板 本题其实就是一个区间DP 的模板题,总长度为len,有n个切割点,也就是说能被切割成n+1段,所以左边界是0,有边界是n + 1,所以答案就是f[0][n + 1]. ...
- Cutting Sticks
UVA10003 这是一道区间动态规划 定义:dp[i][j]dp[i][j]dp[i][j]为第iii个切割点到第jjj个切割点之间的木条的最小切割费用,Point[i]Point[i]Point[ ...
- UVA 818 Cutting Chains(状压 + 暴搜)题解
题意:有1~n个小环,他们中的有些互相扣在一起,问你至少切开几个能把这写小环串成一条链 思路:还是太菜了,题目给的n<=15,显然可以暴力解决. 用二进制表示每个环切还是不切,然后搜索所有情况. ...
- 紫书搜索 习题7-4 UVA - 818 Cutting Chains 暴力+dfs判环+位运算
题目链接: https://vjudge.net/problem/UVA-818 题意: 选几个圆环去open.然后该圆环和其他就断开了.然后用这些open的圆环去连接剩下的圆环[最后打开的会合上], ...
最新文章
- 构建全程电子商务,创新企业经营模式(2)
- csgo服务器linux云崖居,CSGO修改地图天气背景指令
- 面试题40:数组中只出现一次的数字
- ExtJs2.0学习系列(2)--Ext.Panel
- 已免押1000亿!芝麻信用:靠信用出去浪
- TokenInsight:反映区块链行业整体表现的TI指数较昨日同期上涨4.73%
- JAVA实现简单的FTP服务器
- 浅谈数据结构之顺序队列(五)
- z变换解差分方程例题_Z变换及差分方程求解.doc
- android 换机 备份,Recovery(Android手机备份功能)
- linux驱动开发总体结构,设备结构体分析
- 表情包,头像,壁纸小程序达人入驻教程
- Matlab上位机开发(一) —— 了解上位机
- MYSQL的自增长字段可以赋值
- PCB设计:过孔的设计规则
- YOLOv5识别图像内苹果和香蕉
- 中电信披露十一大电话骗术 提醒勿轻易汇款
- [原创] 利用busybox, extlinux 在工控机CompactFlash(CF卡)上构建Linux系统(上)
- 山东智慧电子秤农贸市场升级软硬件方案
- Android Glide加载圆形图片,设置圆形边框
热门文章
- 大学python搜题app_2021年中国大学MOOC的APP用Python玩转数据答案搜题公众号
- python读取excel,数字都是浮点型,日期格式是数字的解决办法
- 2018-2019-2 20175224 实验五《网络编程与安全》实验报告
- EasyUI——实现展示后台数据代码
- Inside dependency property
- Python—实训day7上—Nmupy数值计算基础
- Android—显示窗口调用相机与相册
- java 访问私有成员,在Java中访问私有方法?
- char un 数组printf_c语言中能不能用printf函数直接输出数组?如printf(%d,a[3][3]);
- C#的winform的中委托显示图片