UVA10003
这是一道区间动态规划
定义:dp[i][j]dp[i][j]dp[i][j]为第iii个切割点到第jjj个切割点之间的木条的最小切割费用,Point[i]Point[i]Point[i]为第iii个切割点的位置。
初始化
dp[i][i+1]=0dp[i][i+1]=0dp[i][i+1]=0
因为相邻切割点之间没有切割点,不需要切割。
Point[0]=0Point[n+1]=L(木条长度)Point[0]=0\\Point[n+1]=L(木条长度)Point[0]=0Point[n+1]=L(木条长度)
在头和尾也添加切割点,方便枚举
转移方程
dp[i][j]=min(dp[i][k]+dp[k][j])+Point[j]−Point[i](i<k<j)dp[i][j]=min(dp[i][k]+dp[k][j])+Point[j]-Point[i](i<k<j)dp[i][j]=min(dp[i][k]+dp[k][j])+Point[j]−Point[i](i<k<j)
iii到jjj要切成ikikik和kjkjkj,需要花费ijijij长度的代价,即Point[j]−Point[i]Point[j]-Point[i]Point[j]−Point[i]。
AC代码

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[51][1001], L, n, Point[52];
bool Input() {cin >> L;if (!L) {return false;}cin >> n;for (int i = 1; i <= n; ++i) {cin >> Point[i];}return true;
}
int DP() {Point[n + 1] = L;dp[0][1] = 0;for (int i = 1; i <= n; ++i) {dp[i][i + 1] = 0;}//枚举区间长度for (int NumberOfPoint = 2; NumberOfPoint <= n + 1; NumberOfPoint++) {//枚举起点for (int i = 0; i + NumberOfPoint <= n + 1; i++) {int&&j = i + NumberOfPoint,&&minn = 0xfffffff;//枚举中转点for (int k = i + 1; k < j; k++) {minn = min(minn, dp[i][k] + dp[k][j]);}dp[i][j] = minn + Point[j] - Point[i];}}return dp[0][n + 1];
}
int main() {ios::sync_with_stdio(false);while (Input()) {cout << "The minimum cutting is " << DP() << "." << endl;}return 0;
}

Cutting Sticks相关推荐

  1. UVA10003 切木棍 Cutting Sticks(区间DP、细节)

    整理的算法模板合集: ACM模板 本题其实就是一个区间DP 的模板题,总长度为len,有n个切割点,也就是说能被切割成n+1段,所以左边界是0,有边界是n + 1,所以答案就是f[0][n + 1]. ...

  2. Cutting Sticks UVA - 10003

    题解:dp[ i ][ j ]=min { dp[ i ][ k ]+dp[ k ][ j ] }+a[ j ]-a [i ]. 和石子归并是一样的问题,枚举区间的长度,然后更新这个区间的值. 1 # ...

  3. UVA - 10003 - Cutting Sticks

    原命题链接:PDF/Vjudge 题目的意思是:告诉木棍的总长度,切点个数,和切点位置.每次切割花费的力气为切割的木棍的长度,求出最小花费的力气值. 还没怎么开始看dp,一开始看这道题目,想起了做过的 ...

  4. uva 10003——Cutting Sticks

    题意:给定一长为L的木棍和n个切割点,每次切割的费用为切割的长度,求最小的费用. 思路:dp,子问题是区间(i,j)的最小费用,临界是(i,j)只有一个切割点.dp[i,j]=min(dp[i,k]+ ...

  5. UVA 10003 Cutting Sticks (区间dp)

    题意: 给你一根木块,让你在n个点切块(不能改变顺序),使得总花费最小,看拿来切的那根木棍的长度. 代码: #include <map> #include <set> #inc ...

  6. UVA 10003 Cutting Sticks

    大意:确定切割木棍的次序, 代价为当前木棍长度,使得切割的总的代价最小. 思路:我想了很久,后来发现状态转移方程可以这样表示:d[i][j] = min(d[i][j], d[i][k]+d[k][j ...

  7. UVa 10003 - Cutting Sticks

    记忆化搜索.还有递归调用.大概题意就是一根木棍的长度length,按他所给的点切割.求最大的价值. X , Y 表示 X点到Y点的.转移方程vis[X][Y] = min ( DP[X][i] + D ...

  8. c语言dp状态转移方程,[总结-动态规划]经典DP状态设定和转移方程

    马上区域赛,发现DP太弱,赶紧复习补上. #普通DP CodeForces-546D Soldier and Number Game 筛法+动态规划 待补 UVALive-8078 Bracket S ...

  9. oracle 其他用户表主键,Oracle中查看所有的表,用户表,列名,主键,外键

    在Oracle中查看所有的表: select * from tab/dba_tables/dba_objects/cat; 看用户建立的表 : select table_name from user_ ...

最新文章

  1. Android中ImageView的scaleType 属性说明。
  2. 一文带你熟知ForkJoin
  3. 开会时,尽量考虑录音
  4. kafka入门:简介、使用场景、设计原理
  5. 服装商品销售数据分析
  6. 三菱je -c中映射表的作用_如何将三菱PLC程序转换成欧姆龙PLC程序?
  7. 一个参数在注塑行业的影响——“停留时间”
  8. LS1046A 环境搭建-LSDK快速搭建
  9. 翁恺 python_翁恺 - 主页
  10. 游戏本自动掉帧_玩游戏掉帧怎么办?
  11. sql 求和并且将求和条件作为查询条件
  12. Python基础——零基础学Python
  13. Oracle ERP 库存管理(业务流程 核心流程) [转]
  14. R 语言 apply 系列函数
  15. java.lang.CloneNotSupportedException: com.lbh.xxmanager.basic.alg.Node at java.lang.Object.clone
  16. 解决sudo rosdep init 报错的问题
  17. php 微信提现,微信支付商户提现功能介绍
  18. listen监听队列刨析
  19. (二)requests爬取智能合约账户地址及其交易记录
  20. LabVIEW条件结构

热门文章

  1. 《 Socket.IO》 解决 WebSocket 通信
  2. 微信小程序取本地数据库数据(实测有图)
  3. 如何实现视频平台会员多账号登录
  4. 电脑上如何操作Android手机
  5. D38 Java智能电话项目本————创建实体类
  6. 你的生存模式正确吗?
  7. skywalking本地配置探针 打TID
  8. 水仙花数(所有自幂数)的实现详解-C语言
  9. Unity加载进度条
  10. xiunobbs回帖时间排序修改