zoukankan      html  css  js  c++  java
  • 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;
    } 
  • 相关阅读:
    课后作业03
    课堂测验02
    构建之法阅读笔记02
    进度条 二
    软件工程个人作业02
    Sprint6
    Sprint5
    Alpha版总结会议
    Beta版总结会议
    Alpha阶段项目Postmortem会议总结
  • 原文地址:https://www.cnblogs.com/widsom/p/8387840.html
Copyright © 2011-2022 走看看