codeforces-4D Mysterious Present(二维递增子序列)

原创 2018年04月16日 09:41:15

链接:http://codeforces.com/problemset/problem/4/D

题意:二维递增子序列

题解:先排序,dp【i】表示以i结尾的最长递增子序列的长度,dp【i】= max{dp【j】+1,dp【i】}  j<i, p[i].w>p[j].w&& p[i].h>p[j].h, 注意边界及一些特殊情况

代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

struct node{
    int w, h;
    int id;
}p[5010];

int n;
int w0, h0;
int dp[5010];
int Next[5010];

bool cmp(node a, node b){
    if(a.w == b.w) return a.h<b.h;
    return a.w<b.w;
}

void output(int x){
    if(Next[x] == -1){
        printf("%d", x);
        return;
    }
    output(Next[x]);
    printf(" %d", x);
}
int main(){
    scanf("%d%d%d", &n, &w0, &h0);
    for(int i = 1; i<=n; i++){
        scanf("%d%d", &p[i].w, &p[i].h);
        p[i].id = i;
    }
    sort(p+1, p+1+n, cmp);
    if(p[1].w>w0 && p[1].h>h0) dp[1] = 1;
    memset(Next, -1, sizeof(Next));
    for(int i = 1; i<=n; i++){
        bool flag = true;
        for(int j = 1; j<i; j++){
            //cout<<i<<" "<<j<<" "<<p[i].w<<" "<<p[i].h<<" "<<p[j].w<<" "<<p[j].h<<endl;
            if(p[j].w<p[i].w && p[j].h<p[i].h && p[i].w>w0 && p[i].h>h0){
                //dp[i] = max(dp[i], dp[j]+1);
                //cout<<i<<" "<<dp[i]<<endl;
                if(dp[j]+1>dp[i] && p[j].w>w0 && p[j].h>h0){
                    dp[i] = dp[j]+1;
                    Next[p[i].id] = p[j].id;
                    flag = false;
                }
                //cout<<i<<" "<<dp[i]<<endl;
            }
        }
        if(flag && p[i].w>w0 && p[i].h>h0){
            dp[i] = 1;
        }
    }
    int res = -1;
    int temp;
    for(int i = 1; i<=n; i++){
        //res = max(res, dp[i]);
        if(dp[i]>res){
            res = dp[i];
            temp = p[i].id;
        }
    }
    printf("%d\n", res);
    if(res==0) return 0;
    /*cout<<temp<<endl;
    for(int i = 1; i<=n; i++){
        cout<<Next[i]<<" ";
    }
    cout<<endl;*/
    output(temp);
    printf("\n");



    return 0;
}

/*
5 10 10
22 23
17 19
13 17
8 12
2 6
*/

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GrimCake/article/details/79956465

Codeforces Beta Round #4 (Div. 2 Only) D. Mysterious Present

最长上升子序列,这种水题还是一眼就能看出来的。 题目大意: 主人公想在一张w*h的明信片外套信封。他有n个信封,每个信封的长宽给出,问最多能套多少层。给出从小到大的顺序。 ...
  • lin375691011
  • lin375691011
  • 2014-11-29 14:44:39
  • 4170

Codeforce 4D - Mysterious Present

原题: D. Mysterious Present time limit per test 2 seconds memory limit per test 64 megabyte...
  • xiao597896577
  • xiao597896577
  • 2014-03-06 22:43:08
  • 424

hdu 2145 zz's Mysterious Present

题意:N个城市M个人K条单向边,每个人的速度不同,且在一些城市中。求到达终点时用时最少的人的编号。当用时相同时速度大的优先,速度也相同时编号大优先。 建反向边以终点为源点跑一次spfa即可。因为求的...
  • u014204835
  • u014204835
  • 2014-12-09 21:42:20
  • 360

codeforces 4D Mysterious Present

D. Mysterious Present time limit per test 2 seconds memory limit per test 64 megabytes ...
  • ahoLic
  • ahoLic
  • 2014-05-14 16:25:51
  • 2064

HDU 2145 zz's Mysterious Present(SFPA最短路径)

HDU 2145 zz's Mysterious Present(SFPA最短路径) http://acm.hdu.edu.cn/showproblem.php?pid=2145 题意:有n个城市的有...
  • u013480600
  • u013480600
  • 2014-07-16 19:28:27
  • 823

codeforces 4D D. Mysterious Present(dp)

题目连接:codeforces 4D题目大意:给出n个信封,这n个信封有长和宽,给出卡片的尺寸,求取能够装入卡片的最长的序列,序列满足后一个的长和宽一定大于前一个,求最长的这个序列的长度,并且给出一组...
  • qq_24451605
  • qq_24451605
  • 2015-09-15 10:14:01
  • 1006

codeforce 4D Mysterious Present 简单思路 动态规划

看网上的代码和思路,感觉好复杂的,决定自己写一个代码简洁,思路简单的代码。 这题的意思就是要找出一个最大子序列,这个最大子序列的每个元素就是一个信封,每个信封包含两部分,即信封的宽度和长度,要求序列中...
  • u014311181
  • u014311181
  • 2015-11-09 19:51:09
  • 409

最长递增子序列(一维、二维)

1、一维: void main01() { vector data = { 2, 1, 6, 4, 5, 2, 7, 4}; vector len(data.size(), 1); ...
  • songshiMVP1
  • songshiMVP1
  • 2016-08-20 21:25:51
  • 364

hdu 1160 dp (二维最长上升子序列 记录路径

传送门 FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (...
  • qq_36553623
  • qq_36553623
  • 2017-08-30 11:11:50
  • 118
收藏助手
不良信息举报
您举报文章:codeforces-4D Mysterious Present(二维递增子序列)
举报原因:
原因补充:

(最多只允许输入30个字)