首页 > 其他分享 >[CTSC1997] 选课(树状DP)

[CTSC1997] 选课(树状DP)

时间:2023-06-10 17:56:39浏览次数:35  
标签:CTSC1997 idx 选课 int 树状 学分 课程 修课 DP

刚接触树状DP,好难啊QAQ

[CTSC1997] 选课

题目描述

在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有 N 门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程 a 是课程 b 的先修课即只有学完了课程 a,才能学习课程 b)。一个学生要从这些课程里选择 M 门课程学习,问他能获得的最大学分是多少?

输入格式

第一行有两个整数 N , M 用空格隔开。( 1≤≤3001≤N≤300 , 1≤≤3001≤M≤300 )

接下来的 N 行,第 +1I+1 行包含两个整数 ki​和 si​, ki​ 表示第I门课的直接先修课,si​ 表示第I门课的学分。若 =0ki​=0 表示没有直接先修课(1≤≤1≤ki​≤N , 1≤≤201≤si​≤20)。

输出格式

只有一行,选 M 门课程的最大得分。

输入输出样例

输入 #1
7  4
2  2
0  1
0  4
2  1
7  1
7  6
2  2
输出 #1
13
//本题略有变形,多加思考
#include<bits/stdc++.h>
using namespace std;
const int N=2020;
int f[N][N],w[N]={1},v[N],h[N],e[N],ne[N],idx,res,n,m,root;
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u)
{
    for(int i=h[u];~i;i=ne[i])
    {
        int son=e[i];
        dfs(son);
        for(int j=m;j>=0;j--)//这里为什么要从m开始呢?
    //如标题所示,这个是树状dp的问题,但是按照题意来的话,画完图之后很明显是森林
    //这个时候我们就需要多建立一个0节点来使他们形成树
            for(int k=0;k<=j;k++) f[u][j]=max(f[u][j],f[u][j-k]+f[son][k]);
    }
    for(int i=m+1;i>=1;i--) f[u][i]=f[u][i-1]+v[u];
    f[u][0]=0;
}
int main()
{
    cin>>n>>m;
    memset(h,-1,sizeof h);
    for(int i=0;i<=m+1;i++) f[0][i]=0;
    for(int i=1;i<=n;i++)
    {
        int p;
        cin>>p>>v[i];
        //f[i][1]=v[i];
        add(p,i);
    }
    dfs(0);
    cout<<f[0][m+1];//这里的m+1就是因为多建了个节点,0节点是必须选的,但是呢0节点的价值是0;
    return 0;
}

 

标签:CTSC1997,idx,选课,int,树状,学分,课程,修课,DP
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17471660.html

相关文章

  • python网络爬虫--爬取各省GDP
    一、选题背景1.随着经济全球化的日益深入发展,各国的经济发展也日益重要。在中国,省份是经济发展的基本单位,各省之间经济发展水平的差异较大。了解各省份GDP的数据情况,对于政府部门制定地区经济政策、企业拓展市场等具有重要的参考意义。2.因此,通过Python爬取各省份GPD数据,可......
  • mutate-joins {dplyr}:变异联接
    可变联接将列从y添加到x,并根据键值匹配行:inner_join():包括x和y中的所有行。left_join():包括x中的所有行。right_join():包括y中的所有行。full_join():包括x或y中的所有行。如果x中的一行与y中的多行匹配,则y中的所有行将针对x中的每个匹配行返回一次。......
  • UDP编程
    字节序概念:是指多字节数据的存储顺序小端格式:将低位字节数据存储在低地址(LSB)大端格式:将高位字节数据存储在低地址(MSB)特点1、网络协议指定了通讯字节序—大端2、只有在多字节数据处理时才需要考虑字节序3、运行在同一台计算机上的进程相互通信时,一般不用考虑字节序4、异构......
  • 使用Python提取JPEG图像文件dpi并计算物理尺寸
    感谢浙江省浦江中学方春林老师提供的问题、测试图像和第一版本的代码!下面的代码需要安装Python图像处理库pillow,由于不同公司对JPEG压缩算法和格式的实现不完全一样,有些类型的jpg文件暂时无法提取dpi信息,如果找到好的办法的话后期会再进行补充。fromosimportlistdirfromPILim......
  • Python标准库socketserver实现UDP协议时间服务器
    Python标准库socketserver进行了更高一级的封装,非常适合服务端代码的编写,本文通过改写时间服务器的案例来演示标准库socketserver的用法,更多案例最近会陆续推送。服务端代码: 客户端代码: 运行情况:   ......
  • 关于GDPR体系文件介绍,介绍GDPR体系文件的内容和意义
    随着数字化时代的到来,个人数据保护成为了一个日益受到关注的问题。欧盟于2018年5月25日颁布了“通用数据保护条例”(GDPR),旨在加强对欧洲公民个人数据的保护。GDPR对企业和组织的数据保护和处理流程提出了严格的要求,并可对违反规定者进行高额罚款。本文将介绍GDPR体系文件的内容和意......
  • 「学习笔记」DP 学习笔记1
    序列DP一般序列DP核心思想:将序列的前\(i\)个数的状态用一个更简单的形式表示出,并且体现出这些状态对后续的影响。题目ABC267D给定一个序列\(a\),找到一个长度为\(m\)的子序列\(b\),使得\(\sumb_i×i\)最大。\(n,m\le2×10^3\)。状态:\(f(i,j)\):前\(i......
  • SDP协议
    SDP在webrtc或voip通话中有重要的作用,它通过文本对媒体信息进行描述。其本身并不传递媒体数据,而是用于参与媒体会话的双方进行媒体协商。通过SDP,通信双方可以知道对方的:支持的音视频编码器、网络信息以及其他重要信息。在webrtc中没有规定统一的信令,通常信令使用使用者自己实现。......
  • Oracle重建data pump(expdpd,impdp)How To Reload Datapump Utility EXPDP/IMPDP (Doc ID
    APPLIESTO:OracleDatabaseExadataExpressCloudService-VersionN/AandlaterOracleDatabaseBackupService-VersionN/AandlaterOracleDatabase-EnterpriseEdition-Version10.1.0.2andlaterOracleDatabaseCloudSchemaService-VersionN/Aand......
  • [MDP.DevKit.OpenAI] 使用OpenAI API+C#開發的客服機器人範例
    使用OpenAIAPI+C#開發的客服機器人範例,能讀取知識內容來回答問題。客戶問題:-我想喝綠豆湯該去哪一樓?客服回答:-您可以前往B2的美食生活館,那裡有各種美食餐廳、烘焙店、糕點店、特色咖啡館,以及食品超市,或是售賣烹飪器具、餐具等生活用品店,您可以在那裡找到綠豆湯。知識內容:-......