牛客 - 汉诺塔(思维+dp)
题目链接:点击查看
题目大意:给出 n 个木板,尺寸分别为 Xi * Yi ,现在要求将其分为最少的组,每一个组中都可以通过重新排序使得每个木板都严格递增,此处递增的意思为严格满足 Xi > Xj && Yi > Yj
题目分析:借这个题学到了一个很牛的Dilworth定理,百度百科的内容非常不友善,稍微简单的说一下就是,对于一个数列来说,其最长不下降子序列的个数等于其最长不上升子序列的长度,反过来也一样,所以这个题对于X或者Y任意一维排完序后,求一下最长不下降子序列就是答案了,因为题目还要求输出一下分组,在状态转移的时候顺便储存一下就好了
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;struct Node
{int x,y,id;bool operator<(const Node& a)const{return x<a.x;}
}a[N];int d[N],ans[N],len;int main()
{
//#ifndef ONLINE_JUDGE
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
//#endif
// ios::sync_with_stdio(false);int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&a[i].x,&a[i].y);a[i].id=i;}sort(a+1,a+1+n);len=1;d[len]=a[1].y;ans[a[1].id]=len;for(int i=2;i<=n;i++){if(a[i].y<d[len]){d[++len]=a[i].y;ans[a[i].id]=len;}else{int j=upper_bound(d+1,d+1+len,a[i].y,greater<int>())-d;d[j]=a[i].y;ans[a[i].id]=j;}}printf("%d\n",len);for(int i=1;i<=n;i++)printf("%d ",ans[i]);return 0;
}
牛客 - 汉诺塔(思维+dp)相关推荐
- h0043. 奇怪的汉诺塔
汉诺塔问题,条件如下: 1.这里有A.B.C和D四座塔. 2.这里有n个圆盘,n的数量是恒定的. 3.每个圆盘的尺寸都不相同. 4.所有的圆盘在开始时都堆叠在塔A上,且圆盘尺寸从塔顶到塔底逐渐增大. ...
- 汉诺塔问题(递归与非递归详解)--------------Five—菜鸟级
欢迎前往个人搭建博客 Five-great的博客 汉诺塔 时间限制: 1 s|空间限制: 3 ...
- 牛客每日练习----最长回文,Alice和Bob赌糖果,N阶汉诺塔变形
也许,年少时不能遇见太过惊艳的人,就像你不能做我的诗,而我无法成为你的梦! 链接:https://ac.nowcoder.com/acm/problem/14894 来源:牛客网 题目描述 有两个长度 ...
- $bzoj1019-SHOI2008$ 汉诺塔 $dp$
题面描述 汉诺塔由三根柱子(分别用\(A\ B\ C\)表示)和\(n\)个大小互不相同的空心盘子组成.一开始\(n\)个盘子都摞在柱子\(A\)上,大的在下面,小的在上面,形成了一个塔状的锥形体. ...
- BZOJ 1019: [SHOI2008]汉诺塔( dp )
dp(x, y)表示第x根柱子上y个盘子移开后到哪根柱子以及花费步数..然后根据汉诺塔原理去转移... ------------------------------------------------ ...
- Scratch少儿编程思维题目:汉诺塔游戏
今天给大家做了分享一个比较经典的Scratch少儿编程益智思维游戏案例汉诺塔,把圆盘从下面开始按大小顺序重新摆放在第三根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,操 ...
- 汉诺塔递归的空间复杂度_递归思维——快速排序的详细设计过程
理解递归的运行模型(https://zhuanlan.zhihu.com/p/166173378)之后,就能根据递归函数的静态代码推算执行结果了. 递归思维,是理解递归的基础上,用递归研究并解决问题的 ...
- 【DP】奇怪汉诺塔(ybtoj DP-1-2)
奇怪汉诺塔 ybtoj DP-1-2 题目大意 求四根柱子的汉诺塔问题 输出 共12行 每行输出第一根柱子有i个圆盘的最小步数 解题思路 设aia_iai表示三根柱子,第一根柱子有i个圆盘的步数 很 ...
- 算法练习day15——190403(简介、求n!、汉诺塔、打印字符串的子序列、打印字符串的全排列、母牛生小牛、最小路径和、累加和是否达到给定值)
1. 简介 动态规划是为了优化暴力尝试的. 2. 求n! 2.1 一般思路 public static long getFactorial2(int n) {long result = 1L;for ...
最新文章
- python使用matplotlib可视化3D柱状图(3D bar plot、三维柱状图、包含三个坐标轴x、y、z)、设置zdir参数为y、改变3d图观察的角度
- python读取第二行_使用Python操作Excel(二):读取数据表
- 含有js的英文单词_JavaScript 常用单词整理
- python打包出现乱码_python解压zip包中文乱码解决方法
- spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient 1
- Batch Normalization论文笔记
- Docker系列二~自定义网桥
- 深入Java集合学习系列:HashSet的实现原理
- ibatis 直接升格为 apache 一级项目了
- 十进制小数转二进制用计算机操作,十进制转二进制
- php 语言开发,PHP语言开发常用工具
- 数学作图工具_分别用于教学、排版、科研的数学作图软件
- 微软模拟飞行10厦门航空涂装_微软飞行模拟IGN 评测 10 分:一个任你翱翔的自由世界...
- linux测试消息队列阻塞,Linux进程间通信:消息队列
- 【转载】白素贞的身世之谜
- 怎样把m4a转换mp3格式?
- 爱五笔iWuBi for Mac(五笔练习工具)
- [1.2.0新功能系列:二] Apache Doris 1.2.0 JDBC外表 及 Mutil Catalog
- android mac 照片恢复,万兴安卓照片恢复软件(Mac版本)指南
- 平稳性检验和白噪声检验