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 获取系统环境变量 os.environ and os.putenv

    从一段code说起 “if "BATCH_CONFIG_INI" in os.environ:” 判断环境变量的值有没有定义 如果定义的话就去环境变量的值,否则就取当前目录下的co ...

  2. linux 时区问题

    1.java项目发现 服务器时间不正确,修改了服务器时间之后依然没解决. 2.java虚拟机的时区也需要设置:

  3. java -cp与java -jar的区别

    java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号“;”格式:java -cp .;myClass.j ...

  4. 【LuoguP5171】Earthquake

    题目链接 题意 求满足如下不等式的非负整数 \(x,y\) 的对数 \[ax+by\leq c\] Sol a,b,c 都是非负的,那么先随便变个形: \[y\leq\frac{c-ax}{b}\] ...

  5. vue 报错 :属性undefined(页面成功渲染)

    vue 报错:Cannot read property 'instrumentId' of undefined" 相关代码如下: <template> ... <span& ...

  6. vue 常见错的可能原因

    标签或者组件名写错 Unknown custom element: <h> - did you register the component correctly? For recursiv ...

  7. 【leetcode】313. Super Ugly Number

    题目如下: 解题思路:总结一下这么几点,一出一进,优先级队列排序,保证每次输出的都是当前的最小值.解法大致如图: 代码如下: #include<map> #include<queue ...

  8. 面试题常考&必考之--js中的call()和apply()

    apply: 接受两个参数,第一个参数是要绑定给this的值,第二个参数是一个参数数组.当第一个参数为null.undefined的时候,默认指向window. call: 第一个参数是要绑定给thi ...

  9. vue多层传递$attrs

    今天在使用$attrs的时候遇到一个问题: 父组件: <PanelContainer name="正向舆情"> <PositiveOpinion opinion= ...

  10. Apache简介

    1.什么是Apache 注:Apache是目前使用最广泛的Web服务器软件. 2.发展历史 注:客户端mosaic程序是Netscape浏览器的前身,后来演变成mozilla浏览器,即我们使用的Fir ...