BZOJ 3359: [Usaco2004 Jan]矩形( dp )

数据范围这么小..怎么乱搞都可以吧...

先排序一遍然后O(n²) dp

------------------------------------------------------------------

#include<bits/stdc++.h>

using namespace std;

const int maxn = 109;

struct R {

int x, y;

inline void Read() {

scanf("%d%d", &x, &y);

if(x < y) swap(x, y);

}

bool operator < (const R &o) const {

return x > o.x || x == o.x && y > o.y;

}

} A[maxn];

int dp[maxn];

bool ok(int a, int b) {

return A[a].x > A[b].x && A[a].y >= A[b].y || A[a].x >= A[b].x && A[a].y > A[b].y;

}

int main() {

int N;

cin >> N;

for(int i = 0; i < N; i++) A[i].Read();

sort(A, A + N);

for(int i = 0; i < N; i++) {

dp[i] = 1;

for(int j = 0; j < i; j++)

if(ok(j, i))

dp[i] = max(dp[i], dp[j] + 1);

}

cout << *max_element(dp, dp + N) << "\n";

return 0;

}

-------------------------------------------------------------------

3359: [Usaco2004 Jan]矩形

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 11  Solved: 7
[Submit][Status][Discuss]

Description

给出N个矩形(1≤N≤100)和它的长和宽(不超过1000),写一个程序找出最大的K,使得

有K个矩形满足层层包含的关系,即里层的矩形被所有外层的矩形包含.一个矩形P1包含另一个

矩形P2,则P2的一边小于P1的一边,并且P9的另一边不超过P1的另一边.如果两个矩形相同,视为不包含.如2 x 1的矩形被2x2的矩形包含,不被1 x 2的矩形包含.

注意:矩形的顺序可以是任意的,且矩形可以旋转.

Input

第1行:整数N.

第2到N+1行:矩形的长和宽,均为整数.

Output

一行,输出最大的包含数K.

Sample Input

4
8 14
16 28
29 12
14 8

Sample Output

2

HINT

Source

Orange

时间: 2024-10-07 16:17:20

BZOJ 3359: [Usaco2004 Jan]矩形( dp )的相关文章

3359: [Usaco2004 Jan]矩形

3359: [Usaco2004 Jan]矩形 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 8  Solved: 5[Submit][Status][Discuss] Description 给出N个矩形(1≤N≤100)和它的长和宽(不超过1000),写一个程序找出最大的K,使得 有K个矩形满足层层包含的关系,即里层的矩形被所有外层的矩形包含.一个矩形P1包含另一个 矩形P2,则P2的一边小于P1的一边,并且P9的另一边不超过P1的另一边.如

BZOJ 3361 [Usaco2004 Jan]培根距离

SPFA裸题,练手练手~ #include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; int const maxn = 2*10005; struct node{ int u,v,w,next; node(){} node(int _u,int _v,int _w,int _next){ u = _u; v = _v; w =

BZOJ 1076 奖励关(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1076 题意:n种宝物,每个宝物有两个属性: (1)价值:(2)该宝物的集合S,只有得到了集合S中的宝物时才能得到该宝物.每次从一个黑箱子中随机拿出一个宝物k,若k的集合S中的宝物都已经得 到,则k可要(也可不要),否则k不能要.每次拿到任意宝物概率相等.求随机拿K次的最大期望得分. 思路:从后向前,设f[i][j]表示到第i次拿完宝物,状态为j的最大价值.枚举i+1次拿的宝物k,若k的

BZOJ 1560 火星藏宝图(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1560 题意: 思路:f[i]表示到达i的最大收益.这样是 O(n^2)的.我们考虑,由于转移的条件,a^2+b^2<(a+b)^2,因此对于三个点A.B.C.若A能到B,B能到C,那么A也能到C, 但是不如经过B更好.因此,我们记录到达第j列最靠下的i即可.那么转移(x,y)时,用记录的前y列即可. struct node { int x,y,w; }; node a[N]; int

BZOJ 2298 problem a(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2298 题意:一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) 思路:对于第i个人来说,区间[ai+1,n-bi]的人的分数相同.那么我们用sum[L][R]表示区间[L,R]中总人数.用f[i]表示前i个人中说真话的最大人数,那么f[j]=max(f[i-1]+sum[i][j]). map<pair<in

BZOJ 1801 中国象棋(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1801 题意:在n*m的棋盘上放若干炮使得不互相攻击.有多少种放法?可以放0个.1个....只要不互相攻击就行.. 思路:f[i][j][k]前i行j列有1个炮.k列有两个炮. int n,m; i64 f[N][N][N]; void up(i64 &x,i64 y) { x+=y; x%=mod; } i64 C(int x) { return x*(x-1)/2; } int ma

BZOJ 2331 地板(插头DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2331 题意:给出一个n*m的地面.有些是障碍.用L型的地板砖铺满.有多少种方案. 思路:用0表示没有插头,用1表示有插头且可以拐弯,用3表示有插头但是不能再拐弯了. 设有m列,轮廓线为[0,m].对于格子(i,j),设左插头x上插头y,那么转移有: (1)x=0,y=0:此时如图1-0,有三种转移,分别是1-1,1-2,1-3; (2)x!=0,y!=0:此时只有当x=y=1时可以转移

BZOJ 2306 幸福路径(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2306 题意:给出一个有向图,点有权值 a.初始时在点S.一个人在初始点能量为K=1,每走到下一个点能量值乘以p(p<1),到达一个点u 幸福度为 a[u]*K.求最大的幸福度. 思路:最后必然是走了一条链,或者是一个环(一直绕),或者是一条链加一个环.设f[i][j][k]表示从点j走了i步到达节点k的最大幸福度.那么f[i][j][j]就表示在绕环.那么在这个环上一直绕下去的期望为:

BZOJ 1925 地精部落(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1925 题意:求1到n个所有排列中有多少种满足高低交错. 思路:f[n][k]表示n个数,最后一个为k且最后两个递增,g[n][k]表示n个数最后一个数为k且最后两个递减.对于f[n][k],若我们将每个数x换为n+1-x,则就成了g[n][n+1-k],因此有:f[n][k]=g[n][n+1-k].那么可得: 由于对称性,我们计算出: 那么最后的答案就是2ans. i64 f[2][