洛谷P2014选课

一道树形DP题。

f[i][j]表示i个点选j门课程的最大学分。

递推方程:

for(int a=n;a>0;a--)//总共选择多少
for(int b=0;b<a;b++)//分别选择多少(b,a-b)
f[x][a]=max(f[x][a],f[x][a-b]+f[u][b]);
//都不遍历0的原因是f[i][0]无论怎样都是0

我们可以证明在j<=m时值都是正确的,剩下的不用管啦么的时间!

 1 #include<iostream>
2 #include<cstdio>
3 #include<ctype.h>
4 #include<vector>
5 #include<algorithm>
6 #include<cstring>
7 using namespace std;
8 const int maxn=305;
9 inline int read()
10 {
11 int x,w=1;char c=getchar();
12 while(!isdigit(c))c=getchar();
13 if(c=='-')w=-1,c=getchar();
14 x=c-'0';c=getchar();
15 while(isdigit(c))x=x*10+c-'0',c=getchar();
16 return x*w;
17 }
18 int n,m;
19 int f[maxn][maxn];
20 vector <int>son[maxn];
21 void dfs(int x)
22 {
23 f[x][0]=0;
24 for(int i=0;i<son[x].size();i++)
25 {
26 int u=son[x][i];
27 dfs(u);
28 for(int a=n;a>0;a--)
29 for(int b=0;b<a;b++)
30 f[x][a]=max(f[x][a],f[x][a-b]+f[u][b]);
31 }
32 }
33 int main()
34 {
35 n=read(),m=read()+1;
36 for(int i=1;i<=n;i++){
37 son[read()].push_back(i); f[i][1]=read();
38 }
39 f[0][0]=f[0][1]=0;
40 n++;
41 dfs(0);
42 printf("%d\n",f[0][m]);
43 return 0;
44 }

P2014选课的更多相关文章

  1. 洛谷 P2014 选课(树形背包)

    洛谷 P2014 选课(树形背包) 思路 题面:洛谷 P2014 如题这种有依赖性的任务可以用一棵树表示,因为一个儿子要访问到就必须先访问到父亲.然后,本来本题所有树是森林(没有共同祖先),但是题中的 ...

  2. 树形DP 洛谷P2014 选课

    洛谷P2014 选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门 ...

  3. P2014 选课(树形背包)

    P2014 选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有 ...

  4. P2014 选课 题解(树形DP)

    题目链接 P2014 选课 解题思路 树形动归,用\(f[i][j]\)表示以\(i\)为根,\(j\)个子节点(不包括自己)的最大学分 首先根据题意建图,用根节点\(0\)将森林连成树. 从根节点开 ...

  5. 洛谷P2014——选课

    题目:https://www.luogu.org/problemnew/show/P2014 树状DP,注意枚举当前子树中选几个时的边界. 代码如下: #include<iostream> ...

  6. [Luogu P2014]选课 (树形DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P2014 Solution 这是一道十分经典的树形DP题,这种类型的树形DP有一种很普遍的解法. 首先,观察 ...

  7. 洛谷P2014 选课 (树形dp)

    10月1日更新.题目:在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分 ...

  8. 洛谷P2014 选课

    首先分析题目,这是一道树形dp的题目,是树形背包类的问题,以为每门课的先修课只有一门,所以这一定可以 构成一个森林结构,于是我们可以设计一个虚拟的根节点作为森林的根. 状态转移方程如下 dp[v][k ...

  9. P2014 选课

    题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...

随机推荐

  1. 菜鸟刷题路(随缘刷题):leetcode88

    lc88 class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int i = m - 1, j = ...

  2. Nginx虚拟主机流量状态模块(nginx-module-vts)使用说明文档(四)

    装完NG,为了拿到各种状态指标,就要对NG做监控. Github 2.3k的开源项目nginx-module-vts没准真是你需求的. 链接数,qps,1xx.2xx,.3xx.4xx.5xx的响应数 ...

  3. 【NX二次开发】缝合片体例子UF_MODL_create_sew

    缝合片体,没有成功缝合的片体涂绿色. 效果:  源码: extern DllExport void ufusr(char *param, int *returnCode, int rlen) { UF ...

  4. 你有一份经典SQL语句大全,请注意查收

    一.基础部分 1.创建数据库 CREATE DATABASE dbname 2.删除数据库 DROP DATABASE dbname 3.创建新表 CREATE TABLE tabname(col1 ...

  5. 20201123 实验三《python程序设计》实验报告

    20201123 2020-2021-2 <python程序设计>实验三报告 课程:<Python程序设计>班级:2011姓名:晏鹏捷学号:20201123实验教师:王志强实验 ...

  6. 22、正则表达式(用于三剑客grep,awk,sed,内容中包含空行)

    简单的说就是为处理大量的字符串而定义的一套规则和方法,通过定义特殊符号的辅助,系统管理员就可以快速过滤,替换城输出需要的字符串 : ^:^word 表示匹配以什么字符开头的内容: $:word$表示匹 ...

  7. 使用VS调试时出现 :provider: Named Pipes Provider, error: 40 - 无法打开到 SQL Server 的连接 解决方案

    首先检查链接的数据库名称是否正确 其二是看看你的主机名称由没有写对,有些写成 127.0.0.1会出错.我就是将sessionState中的127.0.0.1出错,改为自己的主机名称就OK啦

  8. 浅析WebSocket 原理

    浅析WebSocket 原理 长恨此身非我有,何时忘却营营. 简介:先简单了解下WebSocket 原理,日后的使用中再进一步深入研究~ 一.什么是WebSocket WebSocket 是HTML5 ...

  9. JVM,我就不信学不会你了

    JVM 对 Java 有多重要,对程序员面试有多重要,这些不用多说. 如果你还没意识到学 JVM 的必要性,或者不知道怎么学 JVM,那么看完这篇文章,你就能知道答案了. 曾经的我很不屑于学 JVM, ...

  10. ollvm混淆的某apk题目的逆向分析

    打开jadx,就发现了我们的老朋友数字壳 典型的类抽取壳,直接上fart脱就完事了,我这里使用的是fart的frida脚本,省去了刷机的步骤 这里的脱壳脚本,自行去github的寒冰大佬那边clone ...