题意:对一根长为l的木棒进行切割,给出n个切割点,每次切割的价值,等于需要切割的木头长度。

一开始理解错了,认为切割点时根据当前木条的左端点往右推算。

实际上,左端点始终是不变的一直是0,右端点一直是l,切割点就是在0 ~ l 之间的点,而切割时的价值就是切割这个点的时候当前木条的长度。

状态转移方程:dp[i][j] = min(dp[i][j],dp[i][k] + dp[k + 1][j] + cut[j] - cut[i]);

思路就是朝着子区间最优的情况靠拢,然后再求全局最优,由于子结构是包含在父结构中,所以用递归写的代码比较简单易懂。

博主 也参考了网上的代码,也有用数组的写法,但是数组写法博主也有还没弄懂的地方。

递归代码:

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<iostream>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
const int inf = 0x3f3f3f3f;
int l,n;
int cut[];
int dp[][]; int DFS(int i, int j){
if(i - j <= ) return ;// 如果不需要切割,那么需要的价值就是0
if(dp[i][j] < inf) return dp[i][j];// 情况不能再分,则返回dp[i][j]的值
for(int k = i + ; k < j ; k++)
dp[i][j] = min(dp[i][j],DFS(i,k) + DFS(k,j) + cut[j] - cut[i]);// 对于每一个子情况用DFS进行搜索,来获取最优情况。
return dp[i][j];// 这里的dp[i][j] 就是最优解了
}
int main(){
while(~scanf("%d",&l) && l != ){
memset(dp,inf,sizeof(dp));
scanf("%d",&n);
for(int i = ; i <= n ; i++){
scanf("%d",&cut[i]);
}
cut[] = ;
cut[n + ] = l;
int ans = DFS(,n+);
printf("The minimum cutting is %d.\n",ans);
}
return ;
}

递归代码

数组代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<iostream>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
const int inf = 0x3f3f3f3f;
int l,n;
int cut[];
int dp[][]; int main(){
while(~scanf("%d",&l) && l != ){
memset(dp,inf,sizeof(dp));
scanf("%d",&n);
for(int i = ; i <= n ; i++){
scanf("%d",&cut[i]);
}
cut[] = ;
cut[n + ] = l;
for(int i = ; i <= n + ; i++) dp[i][i] = ;
for(int i = n + ; i >= ; i--){// 这里从n+1到0进行循环,可以先把子结构的最优解算好,在应用到父结构里面。
for(int j = i ; j <= n + ; j++){
for(int k = i ; k <= j ; k++){
dp[i][j] = min(dp[i][j],dp[i][k] + dp[k + ][j] + cut[j] - cut[i - ]);//博主还是不太明白为什么这里的要减去cut[i - 1]而不是cut[i].
}
}
}
// int ans = DFS(0,n+1);
int ans = dp[][n + ];而且这里输出的是dp[][n + ]而不是dp[][n +]
printf("The minimum cutting is %d.\n",ans);
}
return ;
}

数组代码

一个从很久以前就开始做的梦。

Cutting Sticks UVA - 10003(DP 仍有不明白的地方)的更多相关文章

  1. Cutting Sticks UVA - 10003

    题文: 见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  2. uva 10003 Cutting Sticks 【区间dp】

    题目:uva 10003 Cutting Sticks 题意:给出一根长度 l 的木棍,要截断从某些点,然后截断的花费是当前木棍的长度,求总的最小花费? 分析:典型的区间dp,事实上和石子归并是一样的 ...

  3. UVa 10003 - Cutting Sticks(区间DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVA 10003 Cutting Sticks 切木棍 dp

    题意:把一根木棍按给定的n个点切下去,每次切的花费为切的那段木棍的长度,求最小花费. 这题出在dp入门这边,但是我看完题后有强烈的既是感,这不是以前做过的石子合并的题目变形吗? 题目其实就是把n+1根 ...

  5. uva 10003 Cutting Sticks (区间dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接:  打开 题目大意 一根长为l的木棍,上面有n个"切点",每个点的位置为c[i] 要按照一 ...

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

    UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...

  7. uva 10003 Cutting Sticks(区间DP)

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

  8. UVA 10003 Cutting Sticks(区间dp)

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

  9. 10003 Cutting Sticks(区间dp)

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

随机推荐

  1. 016-PHP读取文件常见属性

    <?php print("文件的所有者(UID 值):"); print(fileowner("data.txt") . "<br> ...

  2. 了解facade设计模式

    Facade模式 Facade模式要求一个子系统的外部与其内部的通信必须通过一个统一的Facade对象进行.Facade模式提供一个高层次的接口,使得子系统更易于使用. 就如同医院的接待员一样,Fac ...

  3. Java中的static关键字和new关键字作用介绍

    一.static关键字的作用 1.可以用于修改类的成员变量.代码块和类 通过static可以将类的成员声明为静态成员,静态的成员归属于整个类,而不是属于某个对象.无论通过类还是对象访问静态成员,操作的 ...

  4. vue使用Vant UI中的swiper组件及传值

    子组件SwiperBanner <!-- --> <template> <div class="swiper"> <van-swipe : ...

  5. hadoop的文件操作整理java

    package dada; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; im ...

  6. vs2012(或2013)与虚拟机连调试

    一.安装Windows Driver Kit 8 1首先在计算机上安装VS2012 (12很容易安装,安装步骤略),然后到官网上下载Windows Driver Kit 8 下载地址: http:// ...

  7. mnist数据集tensorflow实现

    TensorFlow——CNN实现MNIST手写体识别 2019年04月08日 21:46:19 星空Ice_ 阅读数 83   文章目录 TensorFlowCNN实现MNIST 1,数据集 2,回 ...

  8. Swift - 从相册中选择视频(过滤掉照片,使用UIImagePickerController)

    (本文代码已升级至Swift4) 有时我们需要从系统相册中选择视频录像,来进行编辑或者上传操作,这时使用 UIImagePickerController 就可以实现. 默认情况下,UIImagePic ...

  9. 自己整理的常用SQL Server 2005 语句、

    --创建数据库 create database 数据库 go --打开数据库 use 数据库 --删除数据库 drop database 数据库 Go --创建数据表 create table 数据表 ...

  10. 读《软件需求最佳实践》YOUGAN

    这几天在看<软件需求最佳实践>作者徐锋老师的软件需求培训,三天的课程,虽然原来对需求也关注了很多,自己也做过需求分析和开发的工作,但是这次培训感觉收获还是很多.三天的培训先做个记录,后续多 ...