URAL 1078 Segments

URAL 1078

思路:

dp+记忆化搜索

状态:dp[i]表示第i个线段最多包含多少个线段(包括自身)

状态转移:dp[i]=max(dp[i],1+dp[j])线段j包含于i

记录路径,递归输出路径

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))

const int N=500;
int dp[N];
int pre[N];
struct seg{
    int l,r; 
}a[N];
int n;
int dfs(int x){
    if(dp[x]!=-1)return dp[x];
    dp[x]=1;
    for(int i=1;i<=n;i++){
        if(i!=x){
            if(a[x].l<a[i].l&&a[i].r<a[x].r){
                if(dp[x]<1+dfs(i)){
                    dp[x]=1+dfs(i);
                    pre[x]=i;
                }
            }
        }
    }
    return dp[x];
}
void print(int x){
    if(x==-1)return ;
    print(pre[x]);
    cout<<x<<' '; 
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    mem(dp,-1);
    mem(pre,-1);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i].l>>a[i].r;
    int ans=0,id=0;
    for(int i=1;i<=n;i++){
        int t=dfs(i);
        if(t>ans){
            ans=t;
            id=i;
        }
    }
    cout<<ans<<endl;
    print(id); 
    cout<<endl;
    return 0;
} 
原文地址:https://www.cnblogs.com/widsom/p/8387840.html