题目描述

小明很喜欢摆积木,现在他正在玩的积木是由N个木块组成的,他想用这些木块搭出两座高度相同的塔,一座塔的高度是搭建它的所有木块的高度和,并且一座塔至少要用一个木块。每个木块只能用一次,也可以不用。目前已知每块木块的高度,小明想知道在最终两个塔的高度相同的情况下,他所能搭的塔的最大高度是多少,你能帮助他吗?

输入输出格式

输入格式:

第一行为一个整数N,表示木块个数。

第二行是N个整数,表示N块木块的高度。

【数据规模】

对于100%的数据,N≤50,每块木块的高度h满足1≤h≤500000,所有木块的高度总和≤500000。

输出格式:

仅一个整数,表示能搭建的塔的最大高度,若不能搭建两座相同高度的塔,则输出“-1”。

输入输出样例

输入样例#1:

3
2 3 5

输出样例#1:

5

Solution

这道题想了我好一会啊,一直往状压方面凑...不过一开始忽略了一个条件,所有的木块都要放完.
状态需要联系到差值,这类要求相等的题目似乎都可以和差值联系上.
定义状态:
\[f[i][j]\]
1) i代表当前到了第 i 个木块,然后 j 代表此时较小值与较大值的差值.
2) f[i][j] 保存的是当前较小值的值.

状态转移
1) 一个基本的方向:我们让当前的较小值取更大,更接近较大值.
2) 当前这个木块有两个走向:
给较小值:
此时我们由前一个状态走过来话,他们的差值会变得更小.
同时这个较小值也会变大.
此时我们的状态转移即为:
\[f[i][j]=max(f[i-1][j],f[i-1][j+c[i]]+c[i]);\]
给较大值
此时同理上方,但是我们需要比较当前这个 j 和 c[i] 的大小.
因为我们 f 数组记录的是较小值.所以不可能之前的差值为负数.
此时状态转移为:
1.c[i] 大于 j
\[f[i][j]=max(f[i][j],f[i-1][c[i]-j]+c[i]-j);\]
2. j 小于 c[i]
\[f[i][j]=max(f[i][j],f[i-1][j-c[i]]);\]

于是我们转移便已完成.
不过这道题目还有一个坑点,就是极小值必须赋成很小.
否则会 WA 的很惨.

代码

#include<bits/stdc++.h>
using namespace std;
const int inf=19260817;
const int maxn=51;
int f[maxn][maxn*10000],sum;
int n,c[maxn*2],ans=-1;
int main()
{ios::sync_with_stdio(false);cin>>n;for(int i=1;i<=n;i++)cin>>c[i],c[i+n]=c[i],sum+=c[i];for(int i=1;i<=n;i++)for(int j=0;j<=sum;j++)f[i][j]=-inf;f[1][0]=0,f[1][c[1]]=0;for(int i=2;i<=n;i++)for(int j=0;j<=sum;j++){f[i][j]=f[i-1][j];f[i][j]=max(f[i][j],f[i-1][j+c[i]]+c[i]);if(j<c[i])f[i][j]=max(f[i][j],f[i-1][abs(j-c[i])]+c[i]-j);elsef[i][j]=max(f[i][j],f[i-1][j-c[i]]);}if(f[n][0]!=0)ans=f[n][0];cout<<ans<<endl;return 0;
}

转载于:https://www.cnblogs.com/Kv-Stalin/p/9183325.html

P1651 塔 (动态规划)相关推荐

  1. 【每日一题Day33】LC799香槟塔 | 动态规划

    香槟塔[LC799] 我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟. 从顶层的第一个玻璃杯开始倾 ...

  2. 四柱汉诺塔 -- 动态规划求解最优移动次数

    自己用Java写了一个前台进行四柱汉诺塔的移动演示,是按照最优次序进行移动的,链接里有详细的代码实现:https://download.csdn.net/download/qq_40285036/10 ...

  3. 799. 香槟塔 ----- 动态规划、模拟、逆向

    我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯 ...

  4. c语言字母塔问题,(最新整理)数塔问题C语言

    <(最新整理)数塔问题C语言>由会员分享,可在线阅读,更多相关<(最新整理)数塔问题C语言(7页珍藏版)>请在人人文库网上搜索. 1.完整)数塔问题C语言(完整)数塔问题C语言 ...

  5. 杭电oj题目题型分类(转)

    1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...

  6. HDOJ题目分类大全

    版权声明:本文为博主原创文章,欢迎转载,转载请注明本文链接! https://blog.csdn.net/qq_38238041/article/details/78178043 杭电里面有很多题目, ...

  7. HDU题目分类大全【大集合】

    基础题: 1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.  1032.1037.1040.1048.1056.105 ...

  8. 杭电OJ题目分类(转载)

    1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...

  9. hdoj杭电问题分类

    杭电上的题虽然多,但是一直苦于找不到问题分类,网页都是英文的,所以平时做题也没怎么看,今天仔细一看,问题分类竟然就在主页....做了那么久的题居然没发现,表示已经狗带..不要笑,不知道有没有像我一样傻 ...

  10. 转载:Hdu 题目分类

    原址点击 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056. ...

最新文章

  1. 油品调和计算软件_海博柴油批发:调和密度的利润空间
  2. Android清空Fragment缓存,清空Fragment来退栈中某个Fragment
  3. ASA防火墙16 SSL/×××
  4. WINCE应用的UI实现方案
  5. xshell进入桌面_Xshell怎么远程桌面连接Linux系统
  6. CVPR 2019 | 亮风台发布全球最大单目标跟踪数据集LaSOT
  7. Spring框架学习3:bean元素属性
  8. JS弹出可拖动层,并蒙住页面
  9. html绘制流程图飞线,基于jsplumb绘制流程图
  10. VC++绘图时,利用双缓冲解决屏幕闪烁 转载
  11. 系统设计和机器学习算法
  12. 十五道Python小案例,学会这些,Python基础已过关!
  13. Qt css样式大全(整理版)
  14. 时间复杂度和空间复杂度 如何计算?
  15. 震惊世界的中国秘方————里面的方子都是一个老中医几十年的心血!!!...
  16. Redis过期策略 实现原理
  17. allegro差分信号走线_Cadence差分线走线规则
  18. 攻防世界-MISC:glance-50
  19. 如何将多个PDF文件合并为一个PDF,4种工具推荐,适用手机和PC
  20. 物联网安全知识点总结--第六章 物联网应用层安全

热门文章

  1. 【渝粤教育】广东开放大学 计算机组成原理 形成性考核 (21)
  2. 【sklearn第二十四讲】密度估计
  3. 强化学习中价值迭代和策略迭代各有什么优缺点?
  4. 多线程之间通讯JDK1.5-Lock
  5. webpack入门1
  6. 关于EasyUI查询功能的二级联动
  7. spoj 2798 Query on a tree again! 树链剖分
  8. zend framework 重定向方法(render, forward, redirect)总结
  9. 数据结构之搜索算法二:二叉搜索树
  10. IOCP实现聊天服务