箱子嵌套

原题链接

箱子嵌套

描述

考虑一个给出为NN维空间“箱子”的尺度问题。当有两个尺度时,箱子(2,3)(2,3)表示这个箱子长度为22个单位,宽度为33个单位。当有三个尺度时,箱子(4,8,9)(4,8,9)表示这个箱子长度是44个单位,宽度是88个单位,高度是99个单位。当它有66个尺度时,也许,它表现的是不易了解的箱子(4,5,6,7,8,9)(4,5,6,7,8,9);但是我们能分析这个箱子的特性,例如它的各个尺度。

在这个问题中你将分析许多关于NN维空间的箱子,并解决这些箱子的最大的嵌套问题。箱子D=(d1,d2,,dn)D=(d1,d2,…,dn),箱子E=(e1,e2,,en)E = (e1,e2,…,en),di和ei都可以重新排列整理,那么当它们重新排列整理后,箱子D所有的尺度都小于箱子E所有的尺度,那么箱子D可以放入箱子E中。

例如,箱子D=(2,6)D =(2,6),当D重新排列整理成(6,2)(6,2),则可放入箱子E=(7,3)E =(7,3)中,此时DD每个尺度都小于E的相应尺度。如果D经过重新整理后D=(9,7,5,3)D=(9,7,5,3),则不可以放入箱子E=(10,8,6,20)E =(10,8,6,20)中,但是F=(9,5,7,1)F =(9,5,7,1),重新整理后F=(9,7,5,1)F =(9,7,5,1),即符合F放入E的条件。

输入

第一行有两个整数,第一个整数为箱子的总数K,第二个整数为每个箱子的空间维数N。以下K行,每行表示一个箱子,有N个尺度数据,数据间用一个或数个空格分开。(K10000,N10K ≤ 10000,N ≤ 10

仅包含一个整数,输出最大箱子嵌套数目。

输入样例 1

5 2

3 7

8 10

5 2 

9 11

21 18

输出样例 1

5

动态规划

完美嵌套

解决这道题,首先要知道如何将两个箱子完美的进行嵌套。

举个例子

a:4 5 4 8

b:5 5 11 9

把a嵌进b箱子。

从大的开始考虑:a[4]是a中的最大值,值为8。

现在有了2种选择:

  • 用11

  • 用9

11是b中的最大值,9是次大值

如果用的是9,那么11用去哪里。

如果把a中的其中一个换成10呢?

就不能很好的嵌套了,所以最佳选择为11。

再举个例子:

  • a[i],a[j]

  • b[i],b[j]

iji≤j

把a嵌进b里(这是按照排完序后的顺序)

假设a[j]>b[j],我们就只能用b[i]套住a[j]。 但是明显b[j]<a[i],所以就不行。

这道题目要的是完胜,而不是田忌赛马,有一个不行,就是全部不行。

结论

只要在每个箱子的内部排序就是最佳策略。


排完序,一看,求每一个箱子都下降的最长序列,这不就是最长下降子序列吗?

最长下降子序列需要给数组排序。

给所有的维度排序ing...

TLE1.20STLE 1.20S

其实有一个小特性,就是求最长上升下降子序列,需要有一定的顺序,但是不知道为什么,并不需要按照严格的顺序来排序。

所以根据这个特性,我们直接对每个维度的最大值来排序就好了。

代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
int dp[11111];
struct Node{
	int k[11];
}a[11111];
bool cmp(int x,int y) {
	return x>y;
}
bool cmp1(Node x,Node y) {
	return x.k[1]<y.k[1];
}
bool check(int x,int y) {
	for(int i=1;i<=m;i++) {
		if(a[x].k[i]<=a[y].k[i]) return false;
	}
	return true;
}
int main(){
	freopen("box.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=m;j++) {
			cin>>a[i].k[j];
		}
		sort(a[i].k+1,a[i].k+m+1,cmp);
		dp[i]=1;
	}
	sort(a+1,a+n+1,cmp1);
	int ans=0;
	for(int i=1;i<=n;i++) {
		for(int j=1;j<i;j++) {
			if(check(i,j)) {
				dp[i]=max(dp[i],dp[j]+1);
			}
		}
	}
	for(int i=1;i<=n;i++) {
		ans=max(ans,dp[i]);
	}
	cout<<ans;
	return 0;
}
/*
5 2
3 7
8 10
5 2
9 11
21 18
*/

本文作者:cjrqwq

本文链接:https://www.cnblogs.com/yfzqwq/p/18492854

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   cjrqwq  阅读(18)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
展开
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.