[题目来源]:VIjos

[关键字]:动态规划

[题目大意]:用n块水晶搭建两个塔,要求双塔必须一样高,问最大能达到的高度为多少。

//============================================================================================================

[分析]:用f[i,j]表示使用前i个水晶,建起高度差为j的双塔时,较矮的那个塔的最大高度是多少。这样的话,对于每一块水晶都有三种决策,不使用,放到高塔上,放到矮塔上.而放到矮塔上会有两种情况,一是使矮塔的高度超过了高塔,二是没有超过。具体如下:
if f[1-t,j]>f[t,j] then f[t,j]:=f[1-t,j];//不使用
if f[1-t,j]>f[t,j+h[i]] then f[t,j+h[i]]:=f[1-t,j];//高塔
if j>=h[i]//判断会不会使矮塔变成高塔
 then
 begin
  if f[1-t,j]+h[i]>f[t,j-h[i]] then f[t,j-h[i]]:=f[1-t,j]+h[i];
 end//不会
 else
 begin
  if f[1-t,j]+j>f[t,h[i]-j] then f[t,h[i]-j]:=f[1-t,j]+j;
 end;//会
 这样DP就可以了。边界是f[0,0]:=0;目标是f[n,0];
//出自tyvj1114题解

//==========================================================================================================

[代码]:

View Code

 1 program Project1; 2 var 3   n: longint; 4   a, s: array[0..200] of longint; 5   f: array[0..200,0..2500] of longint; 6  7 procedure init; 8 var 9   i: longint;10 begin11   readln(n);12   for i := 1 to n do read(a[i]);13   for i := 1 to n do s[i] := s[i-1]+a[i];14 end;15 16 procedure work;17 var18   i, j: longint;19 begin20   fillchar(f,sizeof(f),200);21   f[0,0] := 0;22   for i := 1 to n do23     for j := 0 to s[i] do24       begin25         if f[i-1,j] > f[i,j] then f[i,j] := f[i-1,j];26         if f[i-1,j] > f[i,j+a[i]] then f[i,j+a[i]] := f[i-1,j];27         if j >= a[i] then28           if f[i-1,j]+a[i] > f[i,j-a[i]] then f[i,j-a[i]] := f[i-1,j]+a[i];29         if j < a[i] then30           if f[i-1,j]+j > f[i,a[i]-j] then f[i,a[i]-j] := f[i-1,j]+j;31       end;32   if f[n,0] > 0 then writeln(f[n,0]) else writeln('Impossible');33 end;34 35 begin36   assign(input,'c:\1.in');reset(input);37   assign(output,'c:\1.out');rewrite(output);38   init;39   work;40   close(input);41   close(output);42 end.

转载于:https://www.cnblogs.com/procedure2012/archive/2011/11/09/2243319.html

[Tyvj1114 搭建双塔]相关推荐

  1. 【VIJOS - P1037】搭建双塔(dp)

    题干: 描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念"9?11"事件,Mr. F决定自己用水晶来搭建一座双塔. ...

  2. vijos 搭建双塔

    描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念"9?11"事件,Mr. F决定自己用水晶来搭建一座双塔. Mr. ...

  3. 推荐系统中的双塔模型

    文章目录 1. 为什么要学习DSSM双塔模型 2. DSSM模型理论知识 2.1 DSSM模型的原理 2.2 DSSM深度语义匹配模型整体结构 2.2.1 输入层 2.2.2 表示层 2.2.3 匹配 ...

  4. 洛谷 深基 第4部分 基础数学与数论(19-21课)

    洛谷 深基 第4部分 基础数学与数论  第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...

  5. 腾讯广告:广告场景下有哪些视觉算法应用?

    AI算法特别是深度学习近年发展迅猛,应用范围大幅提高,为各领域提供了智能解决方案.在2019腾讯广告算法大赛的总决赛现场,腾讯广告高级应用研究员石瑞超为大家带来题为<广告场景下的视觉算法应用&g ...

  6. 备战NOIP每周写题记录(一)···不间断更新

    ※Recorded By ksq2013 //其实这段时间写的题远远大于这篇博文中的内容,只不过那些数以百记的基础题目实在没必要写在blog上; ※week one 2016.7.18 Monday ...

  7. 一句话以上题解及注意事项整理已完成的题目(1)

    jdfz.com 1001 A+B 1006 pla 一维DP+单调栈优化 1007 美食家 贪心策略,尽可能多选 1008 牛排序 二分查找+贪心策略 1009 护花 贪心策略,每次移动y/x最大的 ...

  8. 动态规划常见类型总结

    本文针对动态规划的常见类型进行总结.虽说总结的是动态规划,但顺便把递推也放了进来.严格来说,递推不属于动态规划问题,因为动态规划不仅有递推过程,还要有决策(即取最优),但广义的动态规划是可以包含递推的 ...

  9. linux用户间文件互传,windows和linux间互传文件

    方法1:Xshell传输文件 用rz,sz命令在xshell传输文件 很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz 首先你的Ubuntu需要安 ...

最新文章

  1. spring mvc文件上传小例子
  2. 引用 提高开发水平的几项必备技术
  3. asp.net中GridView传多个值到其它页面的方法
  4. Community Server系列之九:CS2中的用户管理1(MemberRole)
  5. WinCE驱动编写小结(转载)
  6. ShopNC【B2B2C】多用户电商平台系统,带WAP,微商城,圈子,门户
  7. 艾伟_转载:扩展方法 之 基本数据篇
  8. 冲动是魔鬼——4.25
  9. 操作系统 第二部分 进程管理(三)
  10. 手机远程访问HTML5,如何使用手机连接远程桌面?
  11. 家庭版联想台式计算机,联想台式机预装win10家庭版升级win10专业版方法教程
  12. CFSSL 生成证书
  13. 快速达成目标的12种方
  14. 不懂PS怎么修改图片尺寸?
  15. pt-osc在线重建表导致死锁的分析及对应的优化方案
  16. 无线网卡dns服务器地址怎么查询,技术编辑教你win10系统查看无线网卡DNS、IP地址的设置教程...
  17. 单元测试我们需要知道哪些?
  18. 表格标题位置-CSS入门基础(020)
  19. 活码二维码分流规则使用说明
  20. PAMI-2021:5篇顶级GNN论文

热门文章

  1. MYSQL的函数有哪些?(4.3时间与日期函数)
  2. MVC实现实现文件流打包成压缩包
  3. kafka java api 删除_使用Java API创建(create),查看(describe),列举(list),删除(delete)Kafka主题(Topic)...
  4. python入门之运算符的使用的答案_python入门教程之基本算术运算符
  5. java文件流null_JAVA 获取资源文件对象为NULL
  6. qt 设计师缩放_重新设计缩放体验
  7. 美学设计评价_死亡的孩子无法使用的设计美学
  8. C语言之指针与数组总结
  9. NSA泄露的恶意软件DoublePulsar感染了数万台Windows电脑
  10. 从cpp向qml文件传中文字符串的方法