UVA 10003 Cutting Sticks+区间DP

纵有疾风起

题目大意

有一个长为L的木棍,木棍中间有n个切点。每次切割的费用为当前木棍的长度。求切割木棍的最小费用

输入输出

第一行是木棍的长度L,第二行是切割点的个数n,接下来的n行是切割点在木棍上的坐标。

输出切割木棍的最小费用

前话-区间dp简单入门

区间dp的入门下面博客写的非常好,我就是看的他们博客学会的,入门简单,以后的应用就得靠自己了。

https://blog.csdn.net/qq_41661809/article/details/81487613 看懂了,基础入门

https://blog.csdn.net/qq_40772692/article/details/80183248 略微进阶些

https://www.cnblogs.com/HDUjackyan/p/9123199.html 专题训练+代码实现

解题思路

  1. 使用动态规划,定义\(dp[\ i\ ][\ j\ ]\)为切割木棍\(i-j\)的最优费用,然后使用区间dp来进行处理
  2. 或则使用搜索算法进行,但是为了降低复杂度,一般会使用记忆化搜索。

代码

// 动态规划解法
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm> using namespace std; const int inf=0x3f3f3f3f;
int cut[100];
int dp[100][100]; int main()
{
int L, n;
while(scanf("%d",&L) && L)
{
memset(dp, inf, sizeof(dp));
cin>>n;
for(int i=1; i<=n; i++){
cin>>cut[i];
}
cut[0]=0;
cut[n+1]=L;
for(int i=0; i<=n; i++)
dp[i][i+1]=0; //相邻两个切割点之间是一段木棍,根据dp的含义,它们的值为零
for(int len=2; len<=n+1; len++) //枚举区间长度,从长度为2开始
{
for(int i=0; i+len<=n+1; i++) //起点要从0开始
{
int j=i+len; //终点
for(int k=i+1; k<j; k++) //枚举断点
{
dp[i][j]=min(dp[i][k]+dp[k][j]+cut[j]-cut[i], dp[i][j]);
}
}
}
cout<<"The minimum cutting is "<<dp[0][n+1]<<"."<<endl;
}
return 0;
}
//记忆化搜索  搜索真万能!!!
#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;
}
//---------------------
//作者:HelloWorld10086
//来源:CSDN
//原文:https://blog.csdn.net/HelloWorld10086/article/details/40626461
//版权声明:本文为博主原创文章,转载请附上博文链接!

UVA 10003 Cutting Sticks 区间DP+记忆化搜索的更多相关文章

  1. uva 10003 Cutting Sticks(区间DP)

    题目连接:10003 - Cutting Sticks 题目大意:给出一个长l的木棍, 再给出n个要求切割的点,每次切割的代价是当前木棍的长度, 现在要求输出最小代价. 解题思路:区间DP, 每次查找 ...

  2. UVA 10003 Cutting Sticks(区间dp)

    Description    Cutting Sticks  You have to cut a wood stick into pieces. The most affordable company ...

  3. uva 10891 区间dp+记忆化搜索

    https://vjudge.net/problem/UVA-10891 给定一个序列x,A和B依次取数,规则是每次只能从头或者尾部取走若干个数,A和B采取的策略使得自己取出的数尽量和最大,A是先手, ...

  4. (区间dp + 记忆化搜索)Treats for the Cows (POJ 3186)

    http://poj.org/problem?id=3186   Description FJ has purchased N (1 <= N <= 2000) yummy treats ...

  5. 10003 Cutting Sticks(区间dp)

      Cutting Sticks  You have to cut a wood stick into pieces. The most affordable company, The Analog ...

  6. loj 1031(区间dp+记忆化搜索)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1031 思路:dp[i][j]表示从区间i-j中能取得的最大值,然后就是枚举分割点了. ...

  7. BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】

    题目 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够 ...

  8. HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索

    题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析:  枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...

  9. hdu 4597 Play Game(区间dp,记忆化搜索)

    Problem Description Alice and Bob are playing a game. There are two piles of cards. There are N card ...

随机推荐

  1. Python---进阶---函数式编程---lambda

    一. 利用map()函数,把用户输入的不规范的英文,变成首字母大写,其他小写的规范的名字:比如说["ADMAm", "LISA", "JACK&quo ...

  2. Java日期时间以及日期相互转换_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 Java日期时间,以及相互转化,供大家参考,具体内容如下 package com.study.string; impor ...

  3. [LightOJ1240]Point Segment Distance 题解

    题意简述 原题LightOJ 1240,Point Segment Distance(3D). 求三维空间里线段AB与C. 题解 我们设一个点在线段AB上移动,然后发现这个点与原来的C点的距离呈一个单 ...

  4. 20180827-Java网络编程

    Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接 ...

  5. UE4从4.15移植到4.16

    如果是旧版本的工程需要移植到4.16,有几个地方需要修改: 假设RC是工程名,修改如下(三个CS文件) 类似的,插件也需要这样修改

  6. SpringCloud 教程 (六)断路器聚合监控(Hystrix Turbine)

    一.Hystrix Turbine简介 看单个的Hystrix Dashboard的数据并没有什么多大的价值,要想看这个系统的Hystrix Dashboard数据就需要用到Hystrix Turbi ...

  7. 手把手教你搞定个推iOS推送SDK集成

    以下是一位开发者在集成个推iOS推送SDK过程中的真实经历. 作者:Ezreallp 一次偶然的机会,公司的项目要用到推送,我自己本来就很懒,不愿意去弄整套APNS的流程,刚好之前跟朋友聊起过他们的产 ...

  8. .NET COM+级别的事务Transaction实现

    参考: https://docs.microsoft.com/zh-cn/dotnet/api/system.enterpriseservices.contextutil?view=netframew ...

  9. Java数据结构与算法(3):队列

    队列也是一种表,不同的是队列在一端进行插入而在另一端进行删除. 队列模型 队列的基本操作包括入队.出队操作.在表的末端插入元素,在表的开头删除元素,即先进先出(FIFO). 队列的数组实现 对于每一个 ...

  10. SpringBoot项目的前端+thymeleaf模板引擎

    SpringBoot项目创建之后,后台的框架是SpringMVC.但前端的resource和template目录都是空的.这个时候需要创建前台页面. 习惯上,我们会创建JSP,但是,SpringBoo ...