zoukankan      html  css  js  c++  java
  • 洛谷

    https://www.luogu.org/problemnew/show/P1434

    有向图的最长链怎么求?有环肯定不行,这里保证无环。(否则应该使用toposort先求出所有不带环的位置)

    设dp[u]=以u点开始的最长链的长度,那么以u为子节点的v就有dp[v]=max(dp[v],dp[u]+1),遍历其每个子节点就可以得知其最长链。

    所以最简单的方法其实是记忆化搜索。

    第一次完全手写前向星版本的dfs。

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    
    int g[105][105];
    
    int head[10005];
    struct Edge{
        int v,nxt;
        Edge(int v=0,int nxt=0):v(v),nxt(nxt){}
    }edge[10005*4];
    
    int indeg[10005];
    int etop=0;
    void addedge(int u,int v){
        edge[etop].v=v;
        edge[etop].nxt=head[u];
        indeg[v]++;
        head[u]=etop++;
    }
    
    int n,m;
    
    int dp[10005];
    int dfs(int id){
        if(dp[id]!=-1)
            return dp[id];
        else{
            int res=0;
            for(int i=head[id];i!=-1;i=edge[i].nxt){
                res=max(res,dfs(edge[i].v));
            }
            res++;
            return dp[id]=res;
        }
    }
    
    
    int main(){
        scanf("%d%d",&n,&m);
        memset(g,0x3f,sizeof(g));
        memset(head,-1,sizeof(head));
        memset(dp,-1,sizeof(dp));
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%d",&g[i][j]);
            }
        }
    
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(g[i][j]>g[i-1][j]){
                    addedge((i-1)*m+j,(i-2)*m+j);
                }
                if(g[i][j]>g[i+1][j]){
                    addedge((i-1)*m+j,(i)*m+j);
                }
                if(g[i][j]>g[i][j-1]){
                    addedge((i-1)*m+j,(i-1)*m+j-1);
                }
                if(g[i][j]>g[i][j+1]){
                    addedge((i-1)*m+j,(i-1)*m+j+1);
                }
            }
        }
    
        int ans=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(indeg[(i-1)*m+j]==0){
                    ans=max(ans,dfs((i-1)*m+j));
                }
            }
        }
    
        printf("%d
    ",ans);
    
    }
  • 相关阅读:
    14_java之变量|参数|返回值|修饰符
    NYOJ 202 红黑树 (二叉树)
    NYOJ 138 找球号(二) (哈希)
    NYOJ 136 等式 (哈希)
    NYOJ 133 子序列 (离散化)
    NYOJ 129 树的判定 (并查集)
    NYOJ 117 求逆序数 (树状数组)
    NYOJ 93 汉诺塔 (数学)
    HDU 2050 折线分割平面 (数学)
    天梯赛L2-008 最长对称子串 (字符串处理)
  • 原文地址:https://www.cnblogs.com/Yinku/p/10659041.html
Copyright © 2011-2022 走看看