zoukankan      html  css  js  c++  java
  • 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest C(记忆化搜索)

    C题

    Problem C Game Map

    思路:

    之前暴力搜索写了好几发,一直超时,后面看其他人的题解发现要用记忆化搜索。。直接暴力搜的话有太多重

    复的计算。

    dist u 表示以u 为起点所能走的最长路径,通过dfs不断递归能获得以u为起点的最长路径,这条路径上的每个点

    的dist必定是最大的(因为如果不是的话就会继续搜下去),当其他路径经过这些点是时直接加上他们的dist就

    行了,这样就节省了非常多的操作,降低复杂度。

    实现代码:

    #include<bits/stdc++.h>
    using namespace std;
    int dist[100009];
    vector<int>g[100009];
    int dp(int u){
        if(dist[u]==-1){
            dist[u] = 1;
            for(int i = 0;i < g[u].size();i++){
                int v = g[u][i];
                if(g[v].size() > g[u].size())
                    dist[u] = max(dist[u],dp(v)+1);
            }
        }
        return dist[u];
    }
    
    int main()
    {
        int m,n,x,y;
        ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        memset(dist,-1,sizeof(dist));
        cin>>n>>m;
        while(m--){
            cin>>x>>y;
            g[x].push_back(y);
            g[y].push_back(x);
        }
        int ans = 0;
        for(int i = 0;i < n;i ++){
            ans = max(ans,dp(i));
        }
        cout<<ans<<endl;
    }
  • 相关阅读:
    收集的java面试题
    重载和重写的区别
    java中封装的概念
    java中多态的概念
    vue中的$on,$emit,$once,$off源码实现
    js bind的实现
    对象的深拷贝
    v-for的简单实现
    v-for的显示过滤/排序结果
    ES6的数组方法之Array.from
  • 原文地址:https://www.cnblogs.com/kls123/p/8433593.html
Copyright © 2011-2022 走看看