牛客IOI周赛16-普及组 D 杀树

题意:

给出一棵节点数为$n$的树,删去一个点$i$的代价为$a_i$,一条链的长度定义为路径上点的个数。一棵树死了,满足不存在一条长度$ \geq l $的链,牛牛希望用最少代价杀死这棵树。

题解:

  • 树形dp
  • $dp[i][j]$表示以第$i$个点为根的子树中以$i$为端点的最长链小于等于$j$时的最小代价。
  • 以1为根进行深度优先遍历,枚举以当前点为端点的最长链的长度$j$,显然$0 \leq j \leq l-1$,此时一定有一颗子树的以根为端点的最长链长度为$j-1$,其余的为$ \min (j-1,l-j-1)$,这里可以dp一下求最小值。
  • 注意当$j$取0时表示删除当前点,$dp[i][0] = \sum_{k \in son(i)}dp[k][l-1]$

代码:

#include <bits/stdc++.h>
using namespace std;
#define _for(i,a,b) for(int i = (a);i <= (b);++i)
typedef long long ll;
const int maxn = 5000+5;
const int mod = 1e9+7;
ll qpow(ll a,ll b){ll res = 1;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}}
struct graph
{
    int head[maxn],nxt[maxn<<1],to[maxn<<1],w[maxn<<1],sz;
    void init(){memset(head,-1,sizeof(head));}
    graph(){init();}
    void push(int a,int b,int c){nxt[sz]=head[a],to[sz]=b,w[sz]=c,head[a]=sz++;}
    int& operator[](const int a){return to[a];}
}g;
int dp[maxn][maxn],a[maxn];
int n,k;
//dp[i][j]--以第i个点为根的子树中以i为端点的最长链小于等于j时的最小代价。
void dfs(int now,int pre)
{
    dp[now][0]=a[now];
    for(int i = g.head[now];~i;i = g.nxt[i]){
        if(g[i]==pre)continue;
        dfs(g[i],now);
        dp[now][0]+=dp[g[i]][k-1];
    }
    for(int i = 1;i < k;++i){
        int tmp = 0;
        for(int j = g.head[now];~j;j = g.nxt[j]){
            if(g[j]==pre)continue;
            dp[now][i]=min(tmp+dp[g[j]][i-1],dp[now][i]+dp[g[j]][min(i-1,k-i-1)]);
            tmp+=dp[g[j]][min(i-1,k-i-1)];
        }
        dp[now][i]=min(dp[now][i],dp[now][i-1]);
    }
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("simple.in","r",stdin);
    freopen("simple.out","w",stdout);
#endif
    scanf("%d%d",&n,&k);
    for(int i = 1;i <= n;++i)scanf("%d",&a[i]);
    for(int i = 1,a,b;i < n;++i){
        scanf("%d%d",&a,&b);
        g.push(a,b,0);
        g.push(b,a,0);
    }
    dfs(1,0);
    cout<<dp[1][k-1]<<endl;
    return 0;
}
全部评论
我想问下这里tmp的含义是什么
点赞 回复 分享
发布于 2020-05-06 00:38

相关推荐

那一天的Java_Java起来:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务