原题链接  https://www.luogu.com.cn/problem/P1504

闲话时刻

这道题是一道 暴力 dp好题,dp 的方法和平常的不大一样,也许是我的脑回路清奇,总之还是值得做一下的 。

题目大意

有 n 组数,每组数都是从大到小排列(好像没什么用),现在从每组数中删去一些数使得每组数的和相等,问这个相等的和最大是多少;

题解

首先我们看到数据范围比较小,脑子中的第一个思路应该是暴力;

暴力什么呢?

一个简单的想法就是把每一组在一波瞎搞之后所能得到的所有可能的高度都记录下来,然后从大到小去枚举最后高度,如果每一组瞎搞之后都能达到这个高度,那么这个高度就是最优解了;

我的思路就是这样,只不过求每一组的所有可能的高度我是用的 dp 来求的,当然是暴力的复杂度qwq

状态设置

dp [ i ][ j ]:第 i 组的积木在瞎搞之后能否达到 j 的高度;

状态转移

假如说 dp [ i ][ j ] 是合法的,那么我们再移走一块积木 a [ k ],那么也是合法的,即:

dp [ i ][ j-a [ k ] ] = dp [ i ][ j- a [ k ] ] | dp [ i ][ j ](要么这个高度本来就合法,要么是 j 通过移走 a [ k ] 使其变得合法,所以中间是 | 运算)

枚举顺序

有个小细节就是:要先枚举每一组的积木再去枚举高度

这样的话才能保证每一块积木只可能被删除一次,如果枚举反了的话会出现一积木多用的现象;

答案

我们从大到小去枚举高度,如果存在一个高度使得每一组积木都可以拼成,那么直接输出并结束程序就OK了;

Code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
char ch=getchar();
int a=,x=;
while(ch<''||ch>'')
{
if(ch=='-') x=-x;
ch=getchar();
}
while(ch>=''&&ch<='')
{
a=(a<<)+(a<<)+(ch-'');
ch=getchar();
}
return a*x;
}
const int N=;
int n;
int len[N],sum[N];
int a[N][N],dp[N][N*N]; //dp[i][j]:第i个城堡进行若干操作后能否得到高度为j的情况
int main()
{
n=read();
for(int i=;i<=n;i++)
{
int x=read();
while(x!=-)
{ //len[i]:第i组积木的个数
a[i][++len[i]]=x; //a[i][j]:第i组的第j个积木的高度
sum[i]+=x; //sum[i]:第i组积木的最大高度(一个积木也没有删掉的情况)
x=read();
}
dp[i][sum[i]]=;
}
for(int i=;i<=n;i++)
for(int j=;j<=len[i];j++) //注意这里一定要先枚举每一组的积木
for(int k=;k<=sum[i];k++) //再枚举高度
dp[i][k]|=dp[i][k+a[i][j]]; //通过dp[i][k+a[i][j]]删除a[i][j]来使dp[i][k]变得合法
for(int j=;j>=;j--)
{
bool bj=;
for(int i=;i<=n;i++)
{
if(!dp[i][j]) //只要有一组拼不成就白搭
{
bj=;
break;
}
}
if(bj==) //如果都能拼成的话,此时的高度一定是最优解
{
printf("%d\n",j);
return ;
}
}
return ;
}

P1504 积木城堡的更多相关文章

  1. 到达型01背包---P1504 积木城堡

    P1504 积木城堡 题解 到达型01背包 对于每一组城堡,它可以到达一些高度 但是我们要求的是所有背包可以到达的公共高度的最大值 f[ i ] 表示对于一组城堡,能否到达高度 j ,然后我们跑 n ...

  2. 洛谷P1504 积木城堡

    题目描述 XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木 ...

  3. 洛谷 P1504 积木城堡

    题目传送门 解题思路: 01背包. AC代码: #include<iostream> #include<cstdio> #include<vector> using ...

  4. VIJOS-P1059 积木城堡

    洛谷 P1504 积木城堡 https://www.luogu.org/problem/P1504 JDOJ 1240: VIJOS-P1059 积木城堡 https://neooj.com/oldo ...

  5. vijos1059 积木城堡[n年浙江省队第X轮](背包的方案总数 or 01背包)

    描述 XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大, ...

  6. vijosP1059 积木城堡

    vijosP1059 积木城堡 链接:https://vijos.org/p/1059 [思路] 01背包. 刚开始想麻烦了,想的是二分答案然后01背包判断是否可行,但是首先答案不满足单调性所以不能二 ...

  7. 【题解】「P1504」积木城堡

    这题是01背包(\(DP\)) 如何判断要拆走那个积木,首先定义一个\(ans\)数组,来存放这对积木能拼成多高的,然后如果\(ans_i = n\)那么就说明这个高度的积木可以. 话不多说,上代码! ...

  8. 积木城堡(dp)

    题目描述 XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木 ...

  9. SOJ 2930_积木城堡

    [题意]若干个城堡,给定每个城堡的积木数及每块积木的棱长.从城堡中抽出积木使每块城堡高度相同,求最大高度 [分析]城堡的积木选择可以看成01背包问题,从最矮的城堡高度开始依次递减,求出使每个背包都能装 ...

随机推荐

  1. 利用ime-mode设置文本框只能输入正整数

    html: <input type="text" id="packageratio"style="ime-mode: disabled;&quo ...

  2. java之hibernate之关联映射之多对一单向关联

    1.在之前学习了单表的crud操作.在实际应用中,大都是多表关联操作,这篇会学习如何处理多表之间的关系. 2.考察书籍表和书籍分类表的关系.书籍表和书籍分类表之间是多对一的关系.数据库的表设计为: 3 ...

  3. ConsoleLoggerExtensions.AddConsole(ILoggerFactory)已过时代码修复

    0x00.问题 netcoreapp2.2环境下, Startup.cs 代码配置如下 public void Configure(IApplicationBuilder app, IHostingE ...

  4. 【洛谷 P5357】 【模板】AC自动机(二次加强版)(AC自动机,差分)

    每次匹配都不停跳fail显然太慢了,于是在每个节点和fail指向的点连一条边,构成一棵树,在这棵树上差分一下就好了. AC自动机 就这个算法而言其实没用想象中那么难. #include <cst ...

  5. Http 请求头包含哪些信息?

    协议头 说明 示例 状态 Accept 可接受的响应内容类型(Content-Types). Accept: text/plain 固定 Accept-Charset 可接受的字符集 Accept-C ...

  6. CSSTab栏下划线跟随效果

    神奇的 ~ 选择符 对于当前 hover 的 li ,其对应伪元素的下划线的定位是 left: 100%,而对于 li:hover ~ li::before,它们的定位是 left: 0. ul li ...

  7. vs code 调试设置

    首先vs code 安装插件:Debugger for Chrome vscode 设置:点击调试按钮,然后调试面板界面再点击设置按钮,添加一个配置,选择环境为:chrome编辑器自动生成一个laun ...

  8. SAP云平台里的三叉戟应用

    大家第一次看到SAP MTA这个词组,会联想到什么? Jerry第一次看到的时候,联想到的是那一个个足坛著名的三叉戟攻击组合. 海皇波塞冬(Poseidon),奥林匹斯十二神中地位仅次于宙斯的大神,海 ...

  9. Python学习日记(五) 编码基础

    初始编码 ASCII最开始为7位,一共128字符.最后确定8位,一共256个字符,最左边的为拓展位,为以后的开发做准备. ASCII码的最左边的一位为0. 基本换算:8位(bit) = 1字节(byt ...

  10. java8 lamb表达式对List排序

    场景一:List<Long> 或其他泛型,非对象 List<Long> ids = new ArrayList(); ids.add(100000001L); ids.add( ...