P1651 塔 (动态规划)
题目描述
小明很喜欢摆积木,现在他正在玩的积木是由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 塔 (动态规划)相关推荐
- 【每日一题Day33】LC799香槟塔 | 动态规划
香槟塔[LC799] 我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟. 从顶层的第一个玻璃杯开始倾 ...
- 四柱汉诺塔 -- 动态规划求解最优移动次数
自己用Java写了一个前台进行四柱汉诺塔的移动演示,是按照最优次序进行移动的,链接里有详细的代码实现:https://download.csdn.net/download/qq_40285036/10 ...
- 799. 香槟塔 ----- 动态规划、模拟、逆向
我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯 ...
- c语言字母塔问题,(最新整理)数塔问题C语言
<(最新整理)数塔问题C语言>由会员分享,可在线阅读,更多相关<(最新整理)数塔问题C语言(7页珍藏版)>请在人人文库网上搜索. 1.完整)数塔问题C语言(完整)数塔问题C语言 ...
- 杭电oj题目题型分类(转)
1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...
- HDOJ题目分类大全
版权声明:本文为博主原创文章,欢迎转载,转载请注明本文链接! https://blog.csdn.net/qq_38238041/article/details/78178043 杭电里面有很多题目, ...
- HDU题目分类大全【大集合】
基础题: 1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.105 ...
- 杭电OJ题目分类(转载)
1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...
- hdoj杭电问题分类
杭电上的题虽然多,但是一直苦于找不到问题分类,网页都是英文的,所以平时做题也没怎么看,今天仔细一看,问题分类竟然就在主页....做了那么久的题居然没发现,表示已经狗带..不要笑,不知道有没有像我一样傻 ...
- 转载:Hdu 题目分类
原址点击 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056. ...
最新文章
- 油品调和计算软件_海博柴油批发:调和密度的利润空间
- Android清空Fragment缓存,清空Fragment来退栈中某个Fragment
- ASA防火墙16 SSL/×××
- WINCE应用的UI实现方案
- xshell进入桌面_Xshell怎么远程桌面连接Linux系统
- CVPR 2019 | 亮风台发布全球最大单目标跟踪数据集LaSOT
- Spring框架学习3:bean元素属性
- JS弹出可拖动层,并蒙住页面
- html绘制流程图飞线,基于jsplumb绘制流程图
- VC++绘图时,利用双缓冲解决屏幕闪烁 转载
- 系统设计和机器学习算法
- 十五道Python小案例,学会这些,Python基础已过关!
- Qt css样式大全(整理版)
- 时间复杂度和空间复杂度 如何计算?
- 震惊世界的中国秘方————里面的方子都是一个老中医几十年的心血!!!...
- Redis过期策略 实现原理
- allegro差分信号走线_Cadence差分线走线规则
- 攻防世界-MISC:glance-50
- 如何将多个PDF文件合并为一个PDF,4种工具推荐,适用手机和PC
- 物联网安全知识点总结--第六章 物联网应用层安全