CTSC 选课
题面(有删减)
题目描述 
学校实行学分制。每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分。学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的。学生选修了这M门课并考核通过就能获得相应的学分。你的任务是为自己确定一个选课方案,使得你能得到的学分最多,并且必须满足先修课优先的原则。假定课程之间不存在时间上的冲突。 
输入输出格式 
输入格式: 
第一行有两个整数N,M用空格隔开。(1<=N<=200,1<=M<=150) 
接下来的N行,第I+1行包含两个整数ki和si, ki表示第I门课的直接先修课,si表示第I门课的学分。若ki=0表示没有直接先修课(1<=ki<=N, 1<=si<=20)。 
输出格式: 
只有一行,选M门课程的最大得分。 
输入输出样例 
输入样例#1: 
7  4 
2  2 
0  1 
0  4 
2  1 
7  1 
7  6 
2  2 
输出样例#1: 
13 
数据范围及提示 Data Size & Hint 
各个测试点1s
CTSC的题目,看到时吓尿了。。。 
恐怖。 
害怕。 
然而这是一道裸的树形DP(刚接触不久)
思路
建图都会吧,每堂课和学它必修的课连一条边。为了方便,每个入度为0的课(即可以直接选的课)与一个虚拟的n+1节点连一条边,然后在树上跑01背包即可。 
以前的题目就是水,这让我想起了IOI数字三角形
常数巨大的丑陋代码
# include <stdio.h>
# include <stdlib.h>
# include <iostream>
# include <string.h>
# include <math.h>
using namespace std;
# define IL inline
# define RG register
# define UN unsigned
# define ll long long
# define rep(i, a, b) for(RG int i = a; i <= b; i++)
# define per(i, a, b) for(RG int i = b; i >= a; i--)
# define uev(e, u) for(RG int e = ft[u]; e != -1; e = edge[e].nt)
# define mem(a, b) memset(a, b, sizeof(a))
# define max(a, b) ((a) > (b)) ? (a) : (b)
# define min(a, b) ((a) < (b)) ? (a) : (b)
IL int Get(){
    RG char c = '!'; RG int num = 0, z = 1;
    while(c != '-' && (c > '9' || c < '0')) c = getchar();
    if(c == '-') z = -1, c = getchar();
    while(c >= '0' && c <= '9') num = num * 10 + c - '0', c = getchar();
    return num * z;
}
const int MAXN = 302, INF = 2147483647;
struct Edge{
    int to, nt;
} edge[MAXN << 1];
int n, m, ft[MAXN], cnt, in[MAXN], w[MAXN], f[MAXN][MAXN];
IL void DP(RG int u){
    rep(i, 1, m) f[u][i] = w[u];
    uev(e, u){
        RG int v = edge[e].to;
        DP(v);
        per(i, 2, m)
            per(j, 1, i - 1)
                f[u][i] = max(f[u][i], f[u][j] + f[v][i - j]);
    }
}
int main(){
    mem(ft, -1);
    n = Get(); m = Get() + 1;
    rep(i, 1, n){
        RG int v = Get(); w[i] = Get();
        if(!v) continue;
        edge[cnt] = (Edge){i, ft[v]}; ft[v] = cnt++;
        in[i]++;
    }
    rep(i, 1, n) if(!in[i]) edge[cnt] = (Edge){i, ft[n + 1]}, ft[n + 1] = cnt++;
    DP(n + 1);
    printf("%lld\n", f[n + 1][m]);
    return 0;
}
CTSC 选课的更多相关文章
- ctsc选课
		
CTSC 1997 大学实行学分制.每门课程都有一定的学分,学生只要选修了这门课并通过考核就能获得相应学分.学生最后的学分是他选修各门课的学分总和. 每个学生都要选择规定数量的课程.有些课程可以直接选 ...
 - CTSC是啥
		
洛谷看到一题的难度NOI/NOI+/CTSC 百度一下 CTSC (China Team Selection Competition)为国际信息学奥林匹克竞赛(International Olympi ...
 - 从零开始学Python06作业思路:学生选课系统
		
一,作业要求 选课系统: 管理员: 创建老师:姓名.性别.年龄.资产 创建课程:课程名称.上课时间.课时费.关联老师 学生:用户名.密码.性别.年龄.选课列表[].上课记录{课程1:[di,a,]} ...
 - python之选课系统详解[功能未完善]
		
作业需求 思路:1.先写出大体的类,比如学校类,学生类,课程类-- 2.写出类里面大概的方法,比如学校类里面有创建讲师.创建班级-- 3.根据下面写出大致的代码,并实现其功能 遇到的困 ...
 - 第一章-第六题(帮人抢票,帮人选课这些软件是否合法 你怎么看?)--By梁旭晖
		
我觉得这些软件是合法的,符合道德规范的. 计算机当初设计的初衷就是简化甚至替代人类的工作.而软件作为计算机硬件的驱动着,其设计就是体现这些原则. 现在互联网上的订票,选课类型的网站还是有很多的,比如: ...
 - Python开发程序:选课系统-改良版
		
程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...
 - SQL Server 【附】创建"商品管理数据库"、"学生选课数据库"的SQL语句
		
附:(创建“商品管理数据库”的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据库_m', file ...
 - BFS、DFS与选课问题(拓扑排序)
		
1选课问题 Leetcode上有这样一道题:有代号0,1,2……n-1的n门课程.其中选择某些课程需要另一些课程作为前提条件.用一组pair来表示这些条件:[1,0],[1,2],表示如果要选修课程1 ...
 - Codevs1378选课[树形DP|两种做法(多叉转二叉|树形DP+分组背包)---(▼皿▼#)----^___^]
		
题目描述 Description 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修 ...
 
随机推荐
- centos出现“FirewallD is not running”怎么办
			
最近在阿里云服务器centos上安装了mysql数据库,默认是不开启远端访问功能,需要设置一下防火墙,在开放默认端口号 3306时提示FirewallD is not running,经过排查发现是防 ...
 - linux 添加静态路由
			
Linux下静态路由修改命令方法一:添加路由route add -net 192.168.0.0/24 gw 192.168.0.1route add -host 192.168.1.1 dev 19 ...
 - Project support  for both iOS 6 and iOS 7
			
原文:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/S ...
 - 听闰土大话前端之ES6是怎么来的
			
前言 相信做前端的朋友没有不知道ECMAScript6的,都知晓ES6新增了不少新的特性,但是你知道ES6是怎么来的吗?今天就让闰土来带大家大话ES6的前世今生.当然了,这篇文章会以扫盲为主,科普为辅 ...
 - PHP实现WebService的简单示例和实现步骤
			
首先我创建的文件有: api.php api的接口类文件 api.wsdl 我创建产生的最后要调用的接口文件 cometrue.php 注册service api类内容的所有内容的执行文件 creat ...
 - [翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Performance Counters(性能计数器)
			
<<返回目录 Performance Counters(性能计数器) 性能计数器是监视应用程序和系统性能的最简单的方法之一.它有几十个类别数百个计数器在,包括一些.net特有的计数器.要访 ...
 - Oracle中的多表查询(笛卡尔积原理)
			
本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查询一起完成各个复杂查询的操作: 一 ...
 - Git版本控制的基本命令
			
安装完了GIT首先要自报家门,否则代码不能提交 git config --global user.name "Your Name" git config --global user ...
 - ICQ
			
我一直都想编一个自己的聊天软件,像QQ那种:最近有时间我就自己编了一个.编写的过程中收获很大…… 现在拿出来跟大家分享,有兴趣的朋友可以和我交流交流. 先给大家看一下效果: 启动服务器: 再给大家看一 ...
 - java基础--面对对象
			
面对对象--概述 什么是对象? +---->对象可以泛指一切现实中存着的事物 +---->类是对象的抽象集合 什么是面对对象? +--->万物皆对象,面对对象实际就是人与万物接触== ...