URAL 1078 Segments
阿新 • • 發佈:2018-01-31
++ 包含 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]; structseg{ 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