原题链接  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. Linux实现MYSQl数据库的定时备份

    今天给大家分享一下如何在Linux下实现MYSQl数据库的定时备份. 前提需要保证你的Linux服务器已经安装了MYSQl数据库服务. 1.创建shell脚本 vim backupdb.sh 创建脚本 ...

  2. HTML学习摘要2

    DAY 2 HTML 标签可以拥有属性.属性提供了有关 HTML 元素的更多的信息. 属性总是以名称/值对的形式出现,比如:name="value". 属性总是在 HTML 元素的 ...

  3. Jmeter学习笔记(十)——元件的作用域和执行顺序

    jmeter是一个开源的性能测试工具,它可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的父子关系,那么随着它们的顺序和所在的域不同,它们在执行的时候,也会有很多不同. jmeter的test pla ...

  4. linux下载并安装redis

    1 到http://redis.io/download 官网下下载最新稳定的redis 2 下载的redis安装包移动到要安装的位置 3 解压安装包 tar zxvf redis-3.0.5.tar. ...

  5. Android笔记(六十七) 自定义控件

    实际编程中,系统提供的控件往往无法满足我们的需求,一来是样子丑陋,二来是一些复杂的组合需要多次使用的话,每次都写一堆控件的组合会很耗费时间,所以我们将这些组件的组合自定义为一个新的控件,以后使用的时候 ...

  6. android studio创建模拟器

    开发环境: 操作系统: windows10 教育版 1903 Android studio :  Android Studio 3.5.1Build #AI-191.8026.42.35.590020 ...

  7. zabbix Server 4.0 监控JMX监控详解

    zabbix Server 4.0 监控JMX监控详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   大家都知道,zabbix server效率高是使用C语言编写的,有很多应用 ...

  8. WSDL知识点

    WSDL 是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言. WSDL简介 1.什么是 WSDL? WSDL 指网络服务描述语言 WSDL 使用 X ...

  9. LeetCode - 61、旋转链表

    给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4-& ...

  10. 基于Java+Selenium的WebUI自动化测试框架(十二)-----读取Excel文件(POI)(2)

    上一篇我们讲了怎么利用Java的反射机制,将Excel的读取到的数据,赋值给我们构造函数中定义的变量. 接下来就简单了,我们将实际实现这个读取的简单过程.来看下面一段代码. private stati ...