dp计算后dfs回溯

http://codeforces.com/contest/4/problem/D

题意  给你n组高为h 宽为w的数  让你求他们最大的排列

每一个都要大于前面所有的h 和 w   并且大于题中给定你的 mih 和 miw

#include <iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<stack>
using namespace std;

struct node
{
    int w,h,id;
};
node a[5040];
int dp[5041];

bool cmp(node a,node b)
{
    if(a.w!=b.w)
        return a.w<b.w;
    else
        return a.h<b.h;
}
int main()
{
    int n,w,h;
    cin>>n>>w>>h;
    for(int i=0;i<n;i++)
    {
        cin>>a[i].w>>a[i].h;
        a[i].id=i;
    }
    sort(a,a+n,cmp);
    int maxn=0,mih=10000000,miw=10000000;
    for(int i=0;i<n+1;i++)
    {
        if(a[i].w>w&&a[i].h>h)
            dp[i]=1;
        else dp[i]=0;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<i;j++)
        {
            if(a[i].h>a[j].h&&a[i].w>a[j].w&&a[i].h>h&&a[i].w>w)
            {
                dp[i]=max(dp[j]+1,dp[i]);

            }
            if(dp[i]>maxn)
            {
                maxn=dp[i];

            }
        }
    }
//    for(int i=0;i<n;i++)
//        cout<<a[i].w<<" "<<a[i].h<<" "<<a[i].id<<endl;
//    for(int i=0;i<n;i++)
//        cout<<dp[i]<<" ";
//    cout<<endl;
    cout<<maxn<<endl;
    stack<int>q;
    for(int i=n-1;i>=0;i--)
    {
        if(dp[i]==maxn&&a[i].h>h&&a[i].w>w&&a[i].h<mih&&a[i].w<miw)
        {
            mih=a[i].h;
            miw=a[i].w;
            maxn--;
            q.push(a[i].id);
        }
    }
    while(!q.empty())
    {
        cout<<q.top()+1<<" ";
        q.pop();
    }
    cout<<endl;
    return 0;
}
/*45 6134 8495
9045 8632
4145 4991
5368 5303
6245 4894
8529 6378
5797 6165
5444 6826
7091 4030
6680 9984
4155 6711
5100 5977
7333 6514
9729 4141
8171 6185
6146 6016
4488 7588
9333 4921
7368 6350
6552 8552
9900 8327
3310 7281
6402 5749
6124 4381
8190 3834
7421 3816
3475 4977
6239 6577
9277 4139
4037 5329
6808 7446
7679 5283
6775 3023
6777 8500
5921 6975
4501 4383
4623 8409
7070 6430
9429 8736
7353 7760
3942 3683
4859 8424
6348 7379
9043 9054
9012 7114
7050 9454*/

原文地址:https://www.cnblogs.com/AAAzhuo/p/11680004.html

时间: 2024-10-10 21:28:16

dp计算后dfs回溯的相关文章

uva--10400+dfs+回溯

题意: 输入n个正整数和一个目标值,可以在这n个数中间填充+ - × /号进行运算,运算从左到右进行,不考虑运算符的优先性. 并且给定下面的规则: 1.填充符号时n个数的顺序不能改变. 2.填充除号的时候必须保证结果为整数. 3.每一步的结果必须在-32000-32000之间. 问是否可以求得目标值. 思路: 很显然可以用dfs+回溯来实现符号的填充,但是直接dfs是绝对会超时的(我就WA了一发);那么我们就要考虑剪枝了,这个题目可以利用状态来进行剪枝:我们记录下每一步得到的结果,如果回溯到这一

CodeForces 550B Preparing Olympiad(DFS回溯)

[题目链接]:click here~~ [题目大意] 一组题目的数目(n<=15),每个题目有相应的难度,问你选择一定的题目(大于r个且小于l个)且选择后的题目里最小难度与最大难度差不小于x,求选择方案数. [解题思路]: DFS+回溯. 先发一发比较拙的代码: #include <bits/stdc++.h> using namespace std; const int N=1e5+10; int num[N],mum[N]; int n,m,q,t,l,r; int top,ans,

POJ1787——背包DP(特定状态+回溯)——Charlie&#39;s Change

Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffee at coffee vending machines at motorests. Charlie hates change. That is basically the setup of your next task. Your program will be given

HDU4960Another OCD Patient(区间dp,分块后再DP)

Another OCD Patient Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 716    Accepted Submission(s): 270 Problem Description Xiaoji is an OCD (obsessive-compulsive disorder) patient. This morni

nyoj 325 zb的生日 【DP】||【DFS】

两种方法: 第一种:将总数一半当做背包,用总数-2*最多能装的数目就是所求: 第二种:深搜: zb的生日 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb立刻下定决心买了一堆西瓜.当他准备把西瓜送给C小加和never的时候,遇到了一个难题,never和C小加不在一块住,只能

蓝桥杯 算法提高 8皇后&#183;改 -- DFS 回溯

  算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋盘. 输出格式 所能得到的最大数字和 样例输入 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 48

HDU 1015 dfs回溯

题目真长.....看了好长时间才看懂.. 就是给你一个32位数字和一个最多15个字符的字符串,从字符串中选出5个字符,若满足题中给的那个式子,输出字典序最大的那5个字符,若不满足,输出no solution. 为了解决字典序问题,在输入字符串后,把字符串按从大到小排一下序,搜索一下若满足条件输出即可. 贴代码. 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <

CodeForces 550B Preparing Olympiad(DFS回溯+暴力枚举)

[题目链接]:click here~~ [题目大意] 一组题目的数目(n<=15),每一个题目有对应的难度,问你选择一定的题目(大于r个且小于l个)且选择后的题目里最小难度与最大难度差不小于x,求选择方案数. [解题思路]: DFS+回溯. 先发一发比較拙的代码: #include <bits/stdc++.h> using namespace std; const int N=1e5+10; int num[N],mum[N]; int n,m,q,t,l,r; int top,ans

NOJ 1074 Hey Judge(DFS回溯)

Problem 1074: Hey Judge Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format:  %lld   Java class name:  Main Description Judge Nicole collected 7 ideas for problems of different levels, she wants to create 5 problems for the nex