1. 程式人生 > >URAL 1078 Segments

URAL 1078 Segments

++ 包含 bit struct i++ clu names main tar

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; }

URAL 1078 Segments