P1651 塔 (动态规划)
题目描述
小明很喜欢摆积木,现在他正在玩的积木是由N个木块组成的,他想用这些木块搭出两座高度相同的塔,一座塔的高度是搭建它的所有木块的高度和,并且一座塔至少要用一个木块。每个木块只能用一次,也可以不用。目前已知每块木块的高度,小明想知道在最终两个塔的高度相同的情况下,他所能搭的塔的最大高度是多少,你能帮助他吗?
输入输出格式
输入格式:
第一行为一个整数N,表示木块个数。
第二行是N个整数,表示N块木块的高度。
【数据规模】
对于100%的数据,N≤50,每块木块的高度h满足1≤h≤500000,所有木块的高度总和≤500000。
输出格式:
仅一个整数,表示能搭建的塔的最大高度,若不能搭建两座相同高度的塔,则输出“-1”。
输入输出样例
输入样例#1:
3
2 3 5
输出样例#1:
5
Solution
这道题想了我好一会啊,一直往状压方面凑...不过一开始忽略了一个条件,所有的木块都要放完.
状态需要联系到差值,这类要求相等的题目似乎都可以和差值联系上.
定义状态:
\]
- i代表当前到了第 i 个木块,然后 j 代表此时较小值与较大值的差值.
- f[i][j] 保存的是当前较小值的值.
状态转移
- 一个基本的方向:我们让当前的较小值取更大,更接近较大值.
- 当前这个木块有两个走向:
给较小值:
此时我们由前一个状态走过来话,他们的差值会变得更小.
同时这个较小值也会变大.
此时我们的状态转移即为:\[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);
\]- 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);
else
f[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;
}
P1651 塔 (动态规划)的更多相关文章
- [bzoj1019][SHOI2008]汉诺塔 (动态规划)
Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的操 ...
- hdu 2084 数塔(动态规划)
本题是一个经典的动态规划题. 直接利用记忆化搜索:见图解 Ac code : #include<stdio.h> #include<string.h> #define max( ...
- luogu P1651 塔
题目描述 小明很喜欢摆积木,现在他正在玩的积木是由N个木块组成的,他想用这些木块搭出两座高度相同的塔,一座塔的高度是搭建它的所有木块的高度和,并且一座塔至少要用一个木块.每个木块只能用一次,也可以不用 ...
- P1651 塔
----------------- 链接:Miku ----------------- 这是一道dp题,我么很容易发现这点. 数据范围很大,如果直接用两个塔的高度当状态,很危险,我们就必须要考虑一下优 ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
- c++ 动态规划(数塔)
c++ 动态规划(dp) 题目描述 观察下面的数塔.写一个程序查找从最高点到底部任意位置结束的路径,使路径经过数字的和最大. 每一步可以从当前点走到左下角的点,也可以到达右下角的点. 输入 5 13 ...
- [ACM_动态规划] 数字三角形(数塔)
递归方法解决数塔问题 状态转移方程:d[i][j]=a[i][j]+max{d[i+1][j],d[i+1][j+1]} 注意:1\d[i][j]表示从i,j出发的最大总和;2\变界值设为0;3\递归 ...
- HDU 2084 数塔(动态规划)
数塔 http://acm.hdu.edu.cn/showproblem.php?pid=2084 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描 ...
随机推荐
- iOS Category实现原理
iOS Category实现原理 实现原理 我们不主动引入 Category 的头文件,Category 中的方法都会被添加进主类中.我们可以通过 - performSelector: 等方式 对 C ...
- MySQL从服务配置文件
[mysql]port=3306socket=/var/lib/mysql/mysql.sockdefault-character-set = utf8mb4 [mysqld]server-id=2l ...
- Django之admin的使用及源码分析
一.admin组件使用 Django本身提供了基于 web 的管理工具.其管理工具是django.contrib的一部分,可在settings.py中的 INSTALLED_APPS 看到: INST ...
- DRM 简介
首先,我们对和DRM 相关的一些概念进行介绍. Buffer: 对于RAC 数据库,当一个数据块被读入到buffer cache后,我们就称其为buffer , cache fusion 会将这个bu ...
- spring (由Rod Johnson创建的一个开源框架)
你可能正在想“Spring不过是另外一个的framework”.当已经有许多开放源代码(和专有)J2EEframework时,我们为什么还需要Spring Framework? Spring是独特的, ...
- 搭建一个入门springboot工程
springboot工程搭建(入门案例) 第一步:创建maven工程 第二步:设置项目信息 第三步:默认项目名称,不用改动(第二步已填写) 第三步:在pom.xml中导入依赖 SpringBoot要 ...
- Bootstrap 表格2
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- javase(8)_集合框架_List、Set、Map
一.集合体系(不包括Queue体系) 二.ArrayList ArrayList的属性 private transient Object[] elementData; //存储元素 private i ...
- TCP/IP各种数据包结构体
下面这些TCP/IP数据包是我在进行Socket及Wipcap网络编程过程中曾经用到过的数据包结构体, 这些东西平时看起来不起眼,真正用到的时候就会觉得非常有用...... 以太帧头格式结构体,共14 ...
- iOS dateformatter设置GMT格式时间--iOS开发系列---项目中成长的知识四
今天在项目中开始接手客户端的签名这个模块,签名这个会在项目结束过后再单独写一下自己的心得! 今天讲讲在签名的过程中我们需要向服务器传送一个Date值,格式要求是格林威治时间,也就是GMT时间! 格式要 ...