思路:
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; }