贪吃的九头龙

树形dp

#include<bits/stdc++.h>
#define N 305
using namespace std;
struct LEB{
    int to,nxt,w;
}e[N<<1];
int f[N][N][2];
int tmp[N][2];
int head[N];
int n,m,k,x,z,y,cnt;
void Build(int x,int y,int z){
    e[++cnt]=(LEB){y,head[x],z};
    head[x]=cnt;
}
void dp(int x,int y){
    f[x][0][0]=f[x][1][1]=0;
    for (int i=head[x];i;i=e[i].nxt){
        int z=e[i].to;
        if (z==y)
            continue;
        dp(z,x);
        memcpy(tmp,f[x],sizeof(tmp));
        memset(f[x],63,sizeof(f[x]));
        for (int j=0;j<=k;j++)
            for(int t=0;t<=j;++t){
                f[x][j][0]=min(f[x][j][0],min(f[z][t][0]+tmp[j-t][0]+(m==2)*e[i].w,f[z][t][1]+tmp[j-t][0]));
                f[x][j][1]=min(f[x][j][1],min(f[z][t][1]+tmp[j-t][1]+e[i].w,f[z][t][0]+tmp[j-t][1]));
            }
    }
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    if (n-k<m-1){
        printf("-1\n");
        return 0;
    }
    for (int i=1;i<n;i++){
        scanf("%d%d%d",&x,&y,&z);
        Build(x,y,z);
        Build(y,x,z);
    }
    memset(f,63,sizeof(f));
    dp(1,1);
    printf("%d\n",f[1][k][1]);
    return 0;
}

原文地址:https://www.cnblogs.com/wjnclln/p/9602433.html

时间: 2024-10-13 03:45:31

贪吃的九头龙的相关文章

Vijos 1523 贪吃的九头龙 【树形DP】

贪吃的九头龙 背景 安徽省芜湖市第二十七中学测试题 NOI 2002 贪吃的九头龙(dragon) Description:OfficialData:OfficialProgram:Converted by JackDavid127 描述 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落. 有一天,有M个脑袋的九头龙看到一棵长有N个果子的果树,喜出望外,

NOI2002 贪吃的九头龙

[问题描述] 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落. 有一天,有M个脑袋的九头龙看到一棵长有N个果子的果树,喜出望外,恨不得一口把它全部吃掉.可是必须照顾到每个头,因此它需要把N个果子分成M组,每组至少有一个果子,让每个头吃一组. 这M个脑袋中有一个最大,称为"大头",是众头之首,它要吃掉恰好K个果子,而且K个果子中理所当

codevs贪吃的九头龙

传说中的九头龙是一种特别贪吃的动物.虽然名字叫“九头龙”,但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落.有一天,有M 个脑袋的九头龙看到一棵长有N 个果子的果树,喜出望外,恨不得一口把它全部吃掉.可是必须照顾到每个头,因此它需要把N 个果子分成M组,每组至少有一个果子,让每个头吃一组.这M个脑袋中有一个最大,称为“大头”,是众头之首,它要吃掉恰好K个果子,而且K个果子中理所当然地应该包括唯一的一个最大的果子.果子由N

多叉树转二叉树+树形dp(codevs 1746 贪吃的九头龙 2002noi)

题目传送门 看到这个题目我们要先把问题简化了,条件中是多叉树,我们可以把它转换成二叉树,左边是儿子右边是兄弟的储存方式. 首先先判断否的部分,当总的果子小于需求,也就是N-k<M-1时输出-1. 我们再判断是的部分 如果没有大头,一定存在难受值为0的方案但是现在题目中有大头,我们就可以按按照小头的个数进行分类 1.有一个小头,我们要考虑小头和大头的难受值之和. 2.有多个小头,因为小头可以在奇偶的进行变换,所以我们只需要考虑大头的难受值. 分析到这里,我们就可以发现是树形dp我们设f[i][j]

Vijos1523 NOI2002 贪吃的九头龙 树形dp

思路不算很难,但细节处理很麻烦 前面建图.多叉转二叉,以及确定dp处理序列的过程都是套路,dp的状态转移过程以注释的形式阐述 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 6 int N,M,K; 7 8 struct Edge 9 { 10 int to,next; 11 int weight; 12 void assign(int

vijos p1523 贪吃的九头龙(未完成)

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int point[303],next[603],v[603],c[603],cnt=0,N,M,K,f[303][303][2]; 6 bool p[303]; 7 void insect(int x,int y,int z){next[cnt]=point[x];point[x]=cnt;v[cn

codevs 1746 贪吃的九头龙

/* 状态定义的没错 就是考试的时候傻啦吧唧的转移左右孩子 其实之转移父亲就简单多了 不用考虑那么多 还有就是偷懒没有把谁有没有找过这个信息转过去 而是搞了个全局变量…wa到挺 再就是特盘的时候还有终止条件写的不好 写的时间也很长 ….. */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 510 #define inf 0x3f3f3f3f using namespace std;

美杜莎和九头蛇的对比

1.介绍 1.1九头蛇 每个密码安全性研究都显示,最大的安全漏洞是密码.该工具是概念证明代码,旨在为研究人员和安全顾问提供可能性,以显示从远程访问系统获得未经授权的访问将多么容易. 此工具仅用于法律目的! 已经有几种登录黑客工具,但是,没有一个工具支持多种协议来攻击或支持并行连接. 经过测试,它可以在Linux,Windows / Cygwin,Solaris,FreeBSD / OpenBSD,QNX(Blackberry 10)和MacOS上完全编译. 当前,该工具支持以下协议:Asteri

动归题目

[POJ1141]括号序列 [POJ1191]棋盘分割 [SPOJ196]决斗 [AOA]跳舞机 [AOA]积木游戏 [AOA]艺术馆的火灾 [AOA]机器人的名字 [UVa10559]方块消除 [AOA]公路巡逻 [POJ1074]并行期望值 [AOA]高性能计算机 [AOA]模板匹配 [AOA]不可解码的编码 [AOA]青蛙的烦恼 [AOA]排列问题 [AOA]最优排序二叉树 [POJ1038] Bugs公司 [UVa10531]迷宫统计 [AOA]贪吃的九头龙 [AOA]快乐的蜜月 [AO