嵌套矩形(动态规划)

摘要:
这样,我们就可以来构建DAG图形,令,被包含的矩形a与包含的矩形b看成a一一˃b的路线,这样就形成了这样的图形:,我们一定知道最小矩形一定是不能包含其他矩形的,同时,知道最大矩形一定不能被包含。最小矩形和最大矩形是这整个dp的边界!同时,给出了dp的走势。

思路:

嵌套矩形(动态规划)第1张先把这些矩形统一 一下,让最长边向下,然后按大小放好。

这样,我们就可以来构建DAG图形, 令,被包含的矩形a与包含的矩形b看成a一一>b的路线,这样就形成了这样的图形:

嵌套矩形(动态规划)第2张,我们一定知道最小矩形一定是不能包含其他矩形的(因为没有矩形比最小矩形还小),同时,知道最大矩形一定不能被包含。(因为没有矩形比最大矩形大)

为什么,我们要考虑最大和最小矩形呢?

最小矩形和最大矩形是这整个dp的边界!同时,给出了dp的走势。

#include<iostream>#include<algorithm>#include<cstring>
using namespacestd;
const int maxn = 1e3 + 10;
intdp[maxn], pre[maxn];
struct node{ intx, y; }a[maxn];
boolcmp(node a, node b){
    if (a.x == b.x)return a.y <b.y;
    return a.x <b.x;
}
intn, x, y;
intt;



intmain(){
    cin >>t;
    while (t--){
        memset(dp, 0, sizeof(dp));
        cin >>n;
        for (int i = 1; i <= n; ++i)
        {
            cin >> x >>y;
            if (x <y)swap(x, y);
            a[i].x = x;        a[i].y =y;
            dp[i] = 1;
        }
        sort(a + 1, a + 1 +n, cmp);
//for (int i = 1; i <= n; ++i)
//cout << "(" << a[i].x << " ," << a[i].y << ")" << endl;

        for (int i = 1; i <= n - 1;++i)
        for (int j = i + 1; j <= n; ++j){
            if (a[i].x < a[j].x&&a[i].y <a[j].y){
                int sum = 1 +dp[i];
                if (dp[j] < sum){ dp[j] = sum; pre[j] =i; }
            }
        }
        int maxx = 1;
        for (int i = 1; i <= n;++i)
        if (dp[maxx] < dp[i])maxx =i;
    //Path(maxx);  cout << endl;
        cout << dp[maxx] <<endl;
    }
}

免责声明:文章转载自《嵌套矩形(动态规划)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇什么是达夫设备(Duff's Device)10.折线连接--从零起步实现基于Html5的WEB设计器Jquery插件(含源码)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

动态规划——线性dp

我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp。在这篇文章中,我们将讨论有关线性dp的一些问题。 在有关线性dp问题中,有着几个比较经典而基础的模型,例如最长上升子序列(LIS)、最长公共子序列(LCS)、最大子序列和等,那么首先我们从这几个经典的问题出发开始对线性dp的探索。 首先我们来看最长上升子序...

斐波那契数列(动态规划)

#include "stdafx.h" #include <iostream> using namespace std; #define MAXSIZE 100 int bofei_bottom(int n) { int f[MAXSIZE]; f[0] = 0; f[1] = 1; for (int i = 2; i <= n;...

贪心整理&amp;amp;一本通1431:钓鱼——题解

题目传送   (其实有一个更正经的题解) 看了许久,发现这题貌似就是一个动态规划啊,但毕竟是贪心题库里的题,还是想想用贪心解吧。 经过(借鉴大佬思路)十分复杂的思考后,终于理解出了这题的贪心思路。该题的难点主要在最后可在任意湖边停住,而且不能往回走,在一个湖钓鱼时的效率还会越来越少。常规的思路看来是不行的了,题目好多动态未知的量,唯有我们更换角度,“化动为...

石子合并(动态规划DP)

时限: 1000ms 内存限制:10000K 总时限:3000ms 描述: 在一个圆形操场的四周摆放着n堆石子(n<= 100),现要将石子有次序地合并成一堆。规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 编一程序,读入石子堆数n及每堆的石子数(<=20)。选择一种合并石子的方案,使得做n-1次合并,得分...

A Mini Locomotive(动态规划 01)

 /*  题意:选出3个连续的 数的个数  为K的区间,使他们的和最大 分析: dp[j][i]=max(dp[j-k][i-1]+value[j],dp[j-1][i]);   dp[j][i]:从j个数种选出i个连续区间  数值的最大和 value[j]:第j个区间内的数的和 和背包有点像,但要活用   */   #include <cstdio...

【动态规划】闫氏dp分析

来源于Acwing yxc的闫氏dp分析讲解,本文为几道经典例题的笔记 目录 53. 最大子序和 120. 三角形最小路径和 91. 解码方法 62. 不同路径 63. 不同路径 II 198. 打家劫舍 72. 编辑距离 53. 最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。...