送分题

问题 F: 送分题

时间限制: 1 Sec  内存限制: 128 MB

题目描述

给定一棵N个节点的树,每个节点上有一个权值,你要从中选出一些点使得权值和最大,任意2个选出的节点之间的距离都要大于K。
为什么这题要叫送分题呢?

输入

第一行两个整数N,K。
接下来一行N个整数,表示第i个节点的权值
接下来N-1行,每行2个数a,b,表示点a和点b之间有边相连

输出

输出一行,表示最大的权值和。

样例输入 Copy

3 1
1 1 1
1 2
1 3

样例输出 Copy

2

提示

题解:树形DP水题,思路见代码!

AC代码:

 1 #pragma GCC optimize(3)
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 const int maxn=11111;
 5 vector<int> edge[maxn];
 6 int v[maxn],n,k,dp[maxn][111];
 7 void dfs(int cur,int fa)
 8 {
 9     int sum[111];
10     memset(sum,0,sizeof(sum));
11     for(int i=0;i<edge[cur].size();i++){
12         int u=edge[cur][i];
13         if(u==fa) continue;
14         dfs(u,cur);
15         for(int j=0;j<=k+1;j++){
16             sum[j]+=dp[u][j];
17         }
18     }
19     dp[cur][0]=sum[k]+v[cur];
20     for(int i=1;i<=k+1;i++){
21         if(i<=(k+1)/2){
22             for(int j=0;j<edge[cur].size();j++){
23                 int u=edge[cur][j];
24                 if(u==fa) continue;
25                 dp[cur][i]=max(dp[cur][i],sum[k+1-i-1]-dp[u][k+1-i-1]+dp[u][i-1]);
26             }
27         }
28         else{
29             dp[cur][i]=sum[i-1];
30         }
31     }
32     for(int i=k;i>=0;i--){
33         dp[cur][i]=max(dp[cur][i],dp[cur][i+1]);
34     }
35 }
36 int main()
37 {
38     scanf("%d %d",&n,&k);
39     for(int i=1;i<=n;i++){
40         scanf("%d",&v[i]);
41     }
42     for(int i=1;i<=n-1;i++){
43         int x,y;
44         scanf("%d %d",&x,&y);
45         edge[x].push_back(y);
46         edge[y].push_back(x);
47     }
48     dfs(1,-1);
49     printf("%d\n",dp[1][0]);
50     return 0;
51 }

原文地址:https://www.cnblogs.com/lglh/p/12247238.html

时间: 2024-08-30 04:45:50

送分题的相关文章

hdu2042 不容易系列之二 (送分题)

不容易系列之二 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23681    Accepted Submission(s): 18920 Problem Description 你活的不容易,我活的不容易,他活的也不容易.不过,如果你看了下面的故事,就会知道,有位老汉比你还不容易. 重庆市郊黄泥板村的徐老汉(大号徐东海,简称XDH)

1501161028-蓝桥杯-算法训练 送分啦

算法训练 送分啦 时间限制:1.0s   内存限制:512.0MB 问题描述 这题想得分吗?想,请输出"yes":不想,请输出"no". 输出格式 输出包括一行,为"yes"或"no". 解题思路 刚看到这题不知道该如何下手,好吧,,,我确实想得分,所以就写了一个输出yes的程序,提交过了,我很诧异,怎么这么简单. 然后又写了一个输出no的程序果然错误了.原来这题就这么简单,想得分就输出yes. 代码 #include<

送分啦

问题描述 这题想得分吗?想,请输出"yes":不想,请输出"no". 输出格式 输出包括一行,为"yes"或"no". #include"stdio.h" int main() { printf("yes"); return 0; } 送分啦

PAT乙级15分题易错题总结

PAT乙级15分题易错题总结 B1026 程序运行时间 输入格式: 输入在一行中顺序给出 2 个整数 C1 和 C2.注意两次获得的时钟打点数肯定不相同,即 C1 < C2,并且取值在 [0,107]. 输出格式: 在一行中输出被测函数运行的时间.运行时间必须按照 hh:mm:ss(即2位的 时:分:秒)格式输出:不足 1 秒的时间四舍五入到秒. 输入样例: 123 4577973 输出样例: 12:42:59 易忽略细节 在计算时,未能正确四舍五入,除100以后余数只要不为零都进位1.//er

算法笔记_063:蓝桥杯练习 送分啦(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 这题想得分吗?想,请输出"yes":不想,请输出"no". 输出格式 输出包括一行,为"yes"或"no". 2 解决方案 初步一看,这题竟然没有输入输出示例,不过也不难吧.好吧,第一次,代码长这样: import java.util.Scanner; public class Main{ public static void main(String[] args)

TC SRM 649 500分题

Problem Statement      You are given an integer sequence A and an int N that is a power of 2. All elements of A are between 0 and N-1, inclusive. You can now choose an integer B which is between 0 and N-1, inclusive. This integer determines a new seq

C语言 &#183; 送分啦

问题描述 这题想得分吗?想,请输出"yes":不想,请输出"no". 输出格式 输出包括一行,为"yes"或"no". 代码如下: #include<stdio.h>int main(){ printf("no");}

topcoder srm656 1000分题

Problem Statement   You are given an int N and a int[] pos. We are interested in some permutations of the set {1,2,...,N}. A permutation p is called good if the following condition is satisfied: for each valid k, we have p(k) < p(k+1) if and only if

浮力计算四大法宝 浮力计算题从此变成拿分题

浮力计算一般是中考的重点知识,同时也是力学部分比较有区分度的一类试题,为了大家能在考试中轻松应对这类试题,小编在此精心总结了4种浮力的计算方法,下面我们一起来学习吧! 1.称重法 图示及公式: 适用范围:在已知物体的重力及液体中的物体受到向上的拉力时. 2.压力差法 图示及公式: 适用范围:(1)已知上.下表面的压强及表面积:(2)已知两个压力 注:上述两条中满足一条即可. 3.阿基米德原理 图示及公式: 适用范围:在已知物体排开液体的体积和液体的密度时. 注意:在计算时要注意统一单位.分清V排