LightOJ1126 Building Twin Towers(DP)
题目
Source
http://www.lightoj.com/volume_showproblem.php?problem=1126
Description
Professor Sofdor Ali is fascinated about twin towers. So, in this problem you are working as his assistant, and you have to help him making a large twin towers.
For this reason he gave you some rectangular bricks. You can pick some of the bricks and can put bricks on top of each other to build a tower. As the name says, you want to make two towers that have equal heights. And of course the height of the towers should be positive.
For example, suppose there are three bricks of heights 3, 4 and 7. So you can build two towers of height 7. One contains a single brick of height 7, and the other contains a brick of height 3 and a brick of height 4. If you are given bricks of heights 2, 2, 3 and 4 then you can make two towers with height 4 (just don't use brick with height 3).
Input
Input starts with an integer T (≤ 100), denoting the number of test cases.
Each case starts with an integer n (1 ≤ n ≤ 50), denoting the number of bricks. The next line contains n space separated integers, each containing the height of the brick hi (1 ≤ hi ≤ 500000). You can safely assume that the sum of heights of all bricks will not be greater than 500000.
Output
For each case, print the case number and the height of the tallest twin towers that can be built. If it's impossible to build the twin towers as stated, print "impossible".
Sample Input
4
3
3 4 7
3
10 9 2
2
21 21
9
15 15 14 24 14 3 20 23 15
Sample Output
Case 1: 7
Case 2: impossible
Case 3: 21
Case 4: 64
分析
题目大概说有n个各有高度的砖头,要用它们叠出两个高度一样的塔,问高度最多为多少。
- dp[i][j]表示前i个砖头中两塔高度差为j能叠出的最高的那座塔的高度
- dp[n][0]即为所求
- 对于第i个砖头不取、取且叠在低塔上、取且叠在高塔上,从i-1的状态转移
- 另外,空间比较大可以用滚动数组
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int d[2][500100];
int main(){
int t,n,a;
scanf("%d",&t);
for(int cse=1; cse<=t; ++cse){
scanf("%d",&n);
memset(d,-1,sizeof(d));
d[0][0]=0;
int k=0;
for(int i=0; i<n; ++i){
scanf("%d",&a);
memcpy(d[!k],d[k],sizeof(d[k]));
for(int j=0; j<=500000; ++j){
if(d[k][j]==-1) continue;
if(j+a<=500000) d[!k][j+a]=max(d[!k][j+a],d[k][j]+a);
if(a>j){
d[!k][a-j]=max(d[!k][a-j],d[k][j]+a-j);
}else{
d[!k][j-a]=max(d[!k][j-a],d[k][j]);
}
}
k^=1;
}
if(d[k][0]==0) printf("Case %d: impossible\n",cse);
else printf("Case %d: %d\n",cse,d[k][0]);
}
return 0;
}
LightOJ1126 Building Twin Towers(DP)的更多相关文章
- lightoj 1126 - Building Twin Towers(dp,递推)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1126 题解:一道基础的dp就是简单的递推可以设dp[height_left][ ...
- UVA 10066 The Twin Towers(LCS)
Problem B The Twin Towers Input: standard input Output: standard output Once upon a time, in an anci ...
- 【BZOJ】2021: [Usaco2010 Jan]Cheese Towers(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=2021 噗,自己太弱想不到. 原来是2次背包. 由于只要有一个大于k的高度的,而且这个必须放在最顶,那 ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
随机推荐
- 使用VS2010创建WebService 发布、测试
http://blog.sina.com.cn/s/blog_45eaa01a0102vopl.html 1 打开VS2010,菜单 文件->新建->项目 2 选择[ASP.net ...
- Kafka 分布式环境搭建
这篇文章将介绍如何搭建kafka环境,我们会从单机版开始,然后逐渐往分布式扩展.单机版的搭建官网上就有,比较容易实现,这里我就简单介绍下即可,而分布式的搭建官网却没有描述,我们最终的目的还是用分布式来 ...
- entity1
- HTML5的属性
一.全局属性 1.class属性 class属性对元素指定CSS类选择器 <!doctype html> <html> <meta charset="utf-8 ...
- 【06-18】CentOS使用笔记
使用中文输入法 搜狗输入法只支持Ubuntu sudo yum install "@Chinese Support" [系统]--->[首选项]--->[输入法]--& ...
- Android ViewPager sharedpreferences
http://www.cnblogs.com/dwinter/archive/2012/02/27/AndroidViewPager%E5%A4%9A%E9%A1%B5%E9%9D%A2%E6%BB% ...
- [译]JavaScript源码转换:非破坏式与再生式
原文:http://ariya.ofilabs.com/2013/06/javascript-source-transformation-non-destructive-vs-regenerative ...
- Apache限制某个目录下的PHP文件没有执行权限
为了安全期间,有时我们需要限制网站下的某些目录对于php脚本不能执行. 有两种方法可以参考: 1. 使用.htaccess 文件限制 在要限制php执行的目录下,创建.htaccess文件,加入内容 ...
- php 跨域、跨子域,跨服务器读取session
1.跨子域和跨服务器解决方式 Session主要分两部分: 一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在 另一个是标志着Session数据的Se ...
- Asp.Net Core--授权介绍
翻译如下: 授权指的是确定一个用户能够做什么的过程.例如用户可以Adam能够创建一个文档库,添加文档,编辑文档并将其删除.用户Bob可能只被授权在单个库中读取文件. 授权与验证,这是查明谁一个用户的过 ...