zoukankan      html  css  js  c++  java
  • 洛谷P2014 选课

    题目描述

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

    输入输出格式

    输入格式:

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

    接下来的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

    /*
        这种题我真的不太会辣 还要感谢孤独粲泽dalao给的思路
        因为这个图还不是树 所以我们假设一个“0”节点(不存在的)链接所有没有先修课的课程
        就可以树形DP了 叕是一道和二叉苹果树差不多的题。其实是用上了背包+树形DP的思想。
        状态转移:f[u][j] = max(f[u][j],f[u][j-k]+f[v][k])
        u表示当前节点 j表示除u外选的课数 f[u][j]表示最大收益
        另外在k <= j-1时枚举k 表示子树v选的课程数
    */
    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int maxn = 305;
    
    int f[maxn][maxn],n,m,head[maxn],cnt;
    
    struct node{
        int pre,to;
    }G[maxn];
    
    void addedge(int from,int to){
        G[++cnt].to = to;
        G[cnt].pre = head[from];
        head[from] = cnt;
    }
    
    void dfs(int u){
        for(int i = head[u];i;i = G[i].pre){
            int v = G[i].to;
            dfs(v);
            for(int j = m+1;j >= 1;j--)//为什么是m-1?我们假设一个0节点链接所有没有先修课的课程,得出来的才是树形结构 所以这里要加上这个0节点
                for(int k = j-1;k >= 1;k--){//为什么要倒序?为了保证计算f[u][j]时 f[u][j-k] 已经算出来了 这样才不会错
                    f[u][j] = max(f[u][j],f[u][j-k]+f[v][k]);
                }
        }
    }
    
    int main()
    {
        int x,y;
        scanf("%d%d",&n,&m);
        for(int i = 1;i <= n;i++){
            scanf("%d",&x);
            addedge(x,i);//先修课向后修课连边
            scanf("%d",&y);
            f[i][1] = y;//这里要初始化哦
        }
        dfs(0);//对“0”节点dfs
        printf("%d",f[0][m+1]);
        return 0;
    }
  • 相关阅读:
    hdu 3666 差分约束系统
    hdu 1198农田灌溉
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    高等微積分(高木貞治) 1.4節 例2
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    解析函數論 Page 29 命題(2) 函數模的有界性
    高等微積分(高木貞治) 1.4節 例2
    解析函數論 Page 29 命題(1) 有界閉集上的一致連續性
    解析函數論 Page 29 命題(3) 模的下界的可達性
    解析函數論 Page 29 命題(2) 函數模的有界性
  • 原文地址:https://www.cnblogs.com/bryce02/p/9919486.html
Copyright © 2011-2022 走看看