题目链接:点击查看

题目大意:给出 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)相关推荐

  1. h0043. 奇怪的汉诺塔

    汉诺塔问题,条件如下: 1.这里有A.B.C和D四座塔. 2.这里有n个圆盘,n的数量是恒定的. 3.每个圆盘的尺寸都不相同. 4.所有的圆盘在开始时都堆叠在塔A上,且圆盘尺寸从塔顶到塔底逐渐增大. ...

  2. 汉诺塔问题(递归与非递归详解)--------------Five—菜鸟级

           欢迎前往个人搭建博客  Five-great的博客                                               汉诺塔 时间限制: 1 s|空间限制: 3 ...

  3. 牛客每日练习----​​​​​​​最长回文,Alice和Bob赌糖果,N阶汉诺塔变形

    也许,年少时不能遇见太过惊艳的人,就像你不能做我的诗,而我无法成为你的梦! 链接:https://ac.nowcoder.com/acm/problem/14894 来源:牛客网 题目描述 有两个长度 ...

  4. $bzoj1019-SHOI2008$ 汉诺塔 $dp$

    题面描述 汉诺塔由三根柱子(分别用\(A\ B\ C\)表示)和\(n\)个大小互不相同的空心盘子组成.一开始\(n\)个盘子都摞在柱子\(A\)上,大的在下面,小的在上面,形成了一个塔状的锥形体. ...

  5. BZOJ 1019: [SHOI2008]汉诺塔( dp )

    dp(x, y)表示第x根柱子上y个盘子移开后到哪根柱子以及花费步数..然后根据汉诺塔原理去转移... ------------------------------------------------ ...

  6. Scratch少儿编程思维题目:汉诺塔游戏

    今天给大家做了分享一个比较经典的Scratch少儿编程益智思维游戏案例汉诺塔,把圆盘从下面开始按大小顺序重新摆放在第三根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,操 ...

  7. 汉诺塔递归的空间复杂度_递归思维——快速排序的详细设计过程

    理解递归的运行模型(https://zhuanlan.zhihu.com/p/166173378)之后,就能根据递归函数的静态代码推算执行结果了. 递归思维,是理解递归的基础上,用递归研究并解决问题的 ...

  8. 【DP】奇怪汉诺塔(ybtoj DP-1-2)

    奇怪汉诺塔 ybtoj DP-1-2 题目大意 求四根柱子的汉诺塔问题 输出 共12行 每行输出第一根柱子有i个圆盘的最小步数 解题思路 设aia_iai​表示三根柱子,第一根柱子有i个圆盘的步数 很 ...

  9. 算法练习day15——190403(简介、求n!、汉诺塔、打印字符串的子序列、打印字符串的全排列、母牛生小牛、最小路径和、累加和是否达到给定值)

    1. 简介 动态规划是为了优化暴力尝试的. 2. 求n! 2.1 一般思路 public static long getFactorial2(int n) {long result = 1L;for ...

最新文章

  1. python使用matplotlib可视化3D柱状图(3D bar plot、三维柱状图、包含三个坐标轴x、y、z)、设置zdir参数为y、改变3d图观察的角度
  2. python读取第二行_使用Python操作Excel(二):读取数据表
  3. 含有js的英文单词_JavaScript 常用单词整理
  4. python打包出现乱码_python解压zip包中文乱码解决方法
  5. spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient 1
  6. Batch Normalization论文笔记
  7. Docker系列二~自定义网桥
  8. 深入Java集合学习系列:HashSet的实现原理
  9. ibatis 直接升格为 apache 一级项目了
  10. 十进制小数转二进制用计算机操作,十进制转二进制
  11. php 语言开发,PHP语言开发常用工具
  12. 数学作图工具_分别用于教学、排版、科研的数学作图软件
  13. 微软模拟飞行10厦门航空涂装_微软飞行模拟IGN 评测 10 分:一个任你翱翔的自由世界...
  14. linux测试消息队列阻塞,Linux进程间通信:消息队列
  15. 【转载】白素贞的身世之谜
  16. 怎样把m4a转换mp3格式?
  17. 爱五笔iWuBi for Mac(五笔练习工具)
  18. [1.2.0新功能系列:二] Apache Doris 1.2.0 JDBC外表 及 Mutil Catalog
  19. android mac 照片恢复,万兴安卓照片恢复软件(Mac版本)指南
  20. 平稳性检验和白噪声检验

热门文章

  1. Nacos配置管理-Nacos实现配置管理
  2. list 数据类型的应用场景
  3. 依赖注入的细节_value子标签_特殊字符的注入
  4. Spring之HelloWorld
  5. response的运行过程
  6. 百万数据报表读取:步骤分析以及自定义事件处理器
  7. 定义和使用含有泛型的类
  8. 手写springiocxml方式注入对象
  9. java mysql embedded,java-将MySQL Connector / MXJ用于应用程序的优点/缺点/替代品有哪些...
  10. Spring--IoC(1)