dp计算后dfs回溯

Posted aaazhuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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*/

 

以上是关于dp计算后dfs回溯的主要内容,如果未能解决你的问题,请参考以下文章

初学树型dp

P2014 选课 题解(树形DP)

换根DP

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

LeetCode 1774 最接近目标价格的甜品成本DFS 回溯 HERODING的LeetCode之路

排列 - DFS 和回溯 - 需要帮助理解展开和回溯