zoukankan      html  css  js  c++  java
  • VK Cup 2012 Round 1 D. Distance in Tree (树形dp)

    题目:http://codeforces.com/problemset/problem/161/D

    题意:给你一棵树,问你两点之间的距离正好等于k的有多少个

    思路:这个题目的内存限制首先大一倍,他有5*1e5个点,k的范围是<=500,首先暴力n^2肯定不行,这个题其实很容易看出是树形dp

    首先k的范围只有500,我们可以开一个dp[1e5][500]的dp数组,代表以这个点为上端点的所有情况,然后最后递归到1点处,dp[1][k]就是答案

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<vector>
    #define maxn 50005
    #define mod 1000000007
    using namespace std;
    typedef long long ll;
    vector<int> mp[maxn];
    ll n,k,num;
    ll q[maxn][505];
    void dfs(int x,int f)
    {
        for(int i=0;i<mp[x].size();i++){
            int u=mp[x][i];
            if(u==f) continue;
            dfs(u,x);
            q[u][0]=1;//每到一个新点,他的孩子到他的距离都是1
            for(int j=k-1;j>=0;j--){
                if(q[u][j])
                {
                   q[u][j+1]=q[u][j+1]+q[u][j];
                   q[u][j]=0;
                   q[x][k]+=q[u][j+1]*q[x][k-j-1];//如果当前点不是上端点,只是两个孩子之间要过度的点
                }
            }
            for(int j=1;j<=k;j++){
                q[x][j]=q[x][j]+q[u][j]; 
            }
        }
        /*printf("%d:",x);
        for(int i=0;i<=k;i++)
        {
            printf(" %d",q[x][i]);
        } 
        printf("
    ");*/ 
    }
    int main()
    {
        cin>>n>>k;
        int x,y;
        for(int i=0;i<n-1;i++){
            cin>>x>>y;
            mp[x].push_back(y);
            mp[y].push_back(x); 
        }
        dfs(1,-1);
        /*for(int i=1;i<=n;i++)
        {
            printf("i:%d",i);
            for(int j=0;j<=k;j++)
            {
                printf(" %d",q[i][j]);
            }
            printf("
    ");
        }*/
        cout<<q[1][k];
    } 
  • 相关阅读:
    新增html元素的使用
    音频的使用和插入以及动态文字的使用
    创建表单以及表单元素的使用
    今天学习image在html中的应用
    Repeater里查找控件
    CSS 基础教程
    自然图像的颜色统计特征 Image Color Statistics
    [转]UE中使用正则表达式的一些技巧
    [转]SQL Server 的事务和锁
    [转]Amtura 商务智能项目实现手记
  • 原文地址:https://www.cnblogs.com/Lis-/p/10797932.html
Copyright © 2011-2022 走看看