题目链接:https://uva.onlinejudge.org/external/100/10003.pdf

题意: L长的木棍,给n个切割点,切成n+1部分,每次切割的时候的费用等于切割时的长度。求最少费用。

这个题目和最优矩阵链乘一样,DP方向既不是顺序,也不是逆序,而是,较大部分状态取决于小部分状态的决策。

d(i,j) 切 i 和 j 的最少费用,那么方程就是 d(i,j) = min(d(i,k)+d(k,j)+a[j]-a[i]);(a[j]-a[i])就是切 i~j的费用。

顺便说一下最优矩阵链乘, n*m 的矩阵 和 m*p 的矩阵,相乘的次数是 n*m*p,矩阵链乘满足结合律,最优矩阵链乘的状态转移方程就是  f(i,j) = min(f(i,k)+f(k+1,j)+pi-1*pk*pj);

切木棍问题也可以用哈夫曼数来做,之前的一篇博客中有写。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define maxn 55
  5. #define INF 0x3f3f3f3f
  6. int a[maxn],vis[maxn][maxn],d[maxn][maxn];
  7.  
  8. int L,n;
  9.  
  10. int dp(int i,int j)
  11. {
  12. if(i>=j-) return ;
  13. if(vis[i][j]) return d[i][j];
  14. vis[i][j] = ;
  15.  
  16. int & ans = d[i][j];
  17. for(int k=; k<=j-; k++)
  18. ans = min(ans,dp(i,k)+dp(k,j)+a[j]-a[i]);
  19. return ans;
  20. }
  21.  
  22. int main()
  23. {
  24. while(scanf("%d",&L),L)
  25. {
  26. scanf("%d",&n);
  27. for(int i=; i<=n; i++)
  28. scanf("%d",&a[i]);
  29. a[] = ;
  30. a[n+] = L;
  31. memset(d,INF,sizeof(d));
  32. memset(vis,,sizeof(vis));
  33.  
  34. int ans = dp(,n+);
  35. printf("The minimum cutting is %d.\n",ans);
  36.  
  37. }
  38.  
  39. return ;
  40. }

Uva 10003,切木棍的更多相关文章

  1. UVA 10003 切木棍(普通DP)

    切木棍 紫书P278 算是简单的dp了吧,当然,这是看完别人题解后的想法,呵呵,我仍然是想了半小时,没思路,啥时候能自个整个dp啊!!→_→ dp的时候,输入数组必须从1开始,一定要注意状态的设计,和 ...

  2. UVa 10003 切木棍(区间DP+最优矩阵链乘)

    https://vjudge.net/problem/UVA-10003 题意: 有一根长度为L的棍子,还有n个切割点的位置.你的任务是在这些切割点的位置处把棍子切成n+1部分,使得总切割费用最小.每 ...

  3. uva 10003 Cutting Sticks 【区间dp】

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

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

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

  5. UVA 10003 Cutting Sticks 切木棍 dp

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

  6. UVA - 10003 Cutting Sticks(切木棍)(dp)

    题意:有一根长度为L(L<1000)的棍子,还有n(n < 50)个切割点的位置(按照从小到大排列).你的任务是在这些切割点的位置处把棍子切成n+1部分,使得总切割费用最小.每次切割的费用 ...

  7. UVA 10003 cuting sticks 切木棍 (区间dp)

    区间dp,切割dp[i][j]的花费和切法无关(无后效性) dp[i][j]表示区间i,j的花费,于是只要枚举切割方法就行了,区间就划分成更小的区间了.O(n^3) 四边形不等式尚待学习 #inclu ...

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

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

  9. UVa 10003 (可用四边形不等式优化) Cutting Sticks

    题意: 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用. 分析: d(i, j)表示切割第i个切点到第j个切点这段所需的最小费用.则有d(i, j) = ...

随机推荐

  1. PostgreSQL Replication之第十二章 与Postgres-XC一起工作(6)

    12.6 添加节点 Postgres-XC允许您在那个过程中的任何一个时间点添加新的服务器到计划中.所有您需要做的是按照我们之前演示的设置一个节点,并在 控制器上调用CREATE NODE.然后,该系 ...

  2. 转:Python一些特殊用法(map、reduce、filter、lambda、列表推导式等)

    Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x): return x**2 l = range(1,10) map( ...

  3. 最长上升子序列(N*log(N))hdu1025

    (HDU1025) Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  4. CentOS 7 下引导 Windows7 启动

    Win7/CentOS7 u盘安装后会覆盖硬盘上已有系统的’引导‘ CentOS7下恢复Win7引导 编辑 # vim /etc/grub.d/40_custom 添加 menuentry 'Wind ...

  5. Java基础(43):Java中的Object类与其方法(转)

    Object类 java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. O ...

  6. SpringMvc:视图和视图解析器

    请求处理方法执行完成后,最终返回一个ModelAndView对象,对于返回String,View或ModelMap等类型的处理方法,SpringMvc也会在内部将它们装配成一个ModelAndView ...

  7. Web Project配置Hirbernate

    1:首先找到hibernate-release-4.1.9.Final.zip\hibernate-release-4.1.9.Final\lib\required ,把required里的所有jar ...

  8. struts不同session范围添加、访问属性

    第01步:编写bean类 package com.self.bean; import java.util.Date; public class User { private Date birthday ...

  9. ahb2apb和apb2apb async bridge

    AHB 3.0目前不支持security world. AHB到APB的async bridge主要包括三个部分: 1)AHB domain 1)产生信号hactive = HSEL & HT ...

  10. centos中的qt设计师所在的包

    由于暂时用不到qt的ide,所以想把它卸了,经过一番查找,其所在的包名是: qt-devel