• luogu 3698 [CQOI2017]小Q的棋盘 树形dp


    Code: 

    #include <bits/stdc++.h>  
    #define N 107   
    #define setIO(s) freopen(s".in","r",stdin)  
    using namespace std;       
    int n,K,f[N][N],g[N][N],tmp[N][N];    
    vector<int>G[N];     
    void add(int u,int v) 
    {
        G[u].push_back(v);    
    } 
    void getmax(int &a,int b) 
    {
        if(b>a) a=b;     
    }
    void dfs(int u,int ff) 
    {       
        f[u][0]=tmp[u][0]=1;         
        for(int i=0;i<G[u].size();++i) 
        {
            int v=G[u][i]; 
            if(v==ff) continue;     
            dfs(v,u);      
            for(int j=K;j>=0;--j) 
            {
                for(int d=0;d<=j;++d)  
                {
                    if(j-d-1>=0) 
                    {
                        getmax(tmp[u][j], f[u][j-d-1]+g[v][d]);          // 新走        
                    }   
                    if(j-d-2>=0) getmax(tmp[u][j],tmp[u][j-d-2]+f[v][d]);         // 以前走过 
                }
            }
            for(int j=K;j>=0;--j) 
            {
                for(int d=0;d<=j;++d)                                                  
                    if(j-d-2>=0) getmax(f[u][j], f[u][j-d-2]+f[v][d]);            
            }        
        }
        for(int i=0;i<=K;++i) g[u][i]=tmp[u][i];     
    }
    int main() 
    {  
        int i,j; 
        // setIO("input");      
        scanf("%d%d",&n,&K);              
        for(i=1;i<=n-1;++i) 
        {
            int a,b; 
            scanf("%d%d",&a,&b),add(a+1,b+1),add(b+1,a+1);   
        }   
        dfs(1,0);    
        int ans=0; 
        for(i=1;i<=K;++i) getmax(ans, g[1][i]);     
        printf("%d
    ",ans); 
        return 0; 
    }
    

      

  • 相关阅读:
    交换相邻字符(CharBuffer)
    ANSI和UNICODE
    关键路径
    拓扑排序 java
    MySql 中group by使用
    面试题2
    面试题
    K8S如何限制资源使用
    Kubernetes中配置Pod的liveness和readiness探针
    sed入门详解教程
  • 原文地址:https://www.cnblogs.com/guangheli/p/11578822.html
Copyright © 2020-2023  润新知