美文网首页
Luogu P2014 选课

Luogu P2014 选课

作者: Macesuted | 来源:发表于2020-01-18 16:44 被阅读0次

题面

对于这道题,我们考虑在树形dp上套背包。我们会非常自然的采用dfs扫描整棵树,然后对树上的每个节点都进行一次背包。

dp[i][j]为在以第i号节点为根结点的子树中,用题目中选法选取j项的最大值。

我们在dfs的过程中,采用递归的方式,在子节点都处理完之后,便考虑将所有子节点的答案综合,得到当前节点的答案。

很显然,就是在容量为j的01背包中放下i节点的所有子节点背包中的答案,我们很容易想到下面的DP方程
f[x][j]=max(f[to][k]+f[x][j-k])
x为当前节点,to为它的某个孩子节点,jk是枚举的两个变量。

就得到了

for(int i=0;j<G[x].size();i++){
    int to=G[x][i];
    dfs(to,x);
    for(int j=m+1;j>=1;j--){
        for(int k=m;k>=0;k--){
            if(j-k<1) continue;
            f[x][j]=max(f[x][j],f[to][k]+f[x][j-k]);
        }
    }
}

最终的答案就是f[0][m+1]了,因为所有没有前提条件的课程都可以指向0,即让第0号课程成为他们的先决条件,因为0号课程自身也算一个课程,所以第二项就是m+1

优化

显然,上述算法时间复杂度为O(N*M^2),虽然在本题已经可以通过,但是如果数据量增加到n<=2000时,应该如何应对

由于对于每一个节点上的背包,我们每一次都枚举到了m+1,但是大部分情况下实际背包一般不会那么大,所以在时间上会产生很大的开销。

考虑下面的这份代码

int dfs(int node)
{
    int sum=0;
    f[node][1]=cost[node];
    for(int i=0;j<G[x].size();i++){
        int to=G[node][i];
        int cnt=dfs(to);
        sum+=cnt;
        for(int j=m+1;j>=1;j--)
            for(int k=min(cnt,j);k>=0;k--){
                if(j<k+1) continue;
                f[node][j]=max(f[node][j],f[to][k]+f[node][j-k]);
            }
    }
    sum++;
    return sum;
}

sum存放当前节点为根的子树的大小,同时dfs值为子树大小直接进行传值。

显然背包的第二重循环是可以像这样优化的,毕竟子节点产生的序列大小也才那么点,这样的话整个子树上的所有情况都只会在这个节点上体现一次(显然之前的方法大量冗余的计算会使得它制造的无用情况会大大多于现在),所以整棵树一共是n个节点,对于每个节点它的孩子的若干个m情况只会经过一次,并且在O(1)时间内直接取出每组情况最优值,所以对于每个点的复杂度是O(m)的,所以总的算法时间复杂度就为O(N*M)了,就可以对付增强后的数据了。

完整代码


转载自本人Luogu Blog这篇文章

相关文章

  • Luogu P2014 选课

    题面 对于这道题,我们考虑在树形dp上套背包。我们会非常自然的采用dfs扫描整棵树,然后对树上的每个节点都进行一次...

  • Luogu P2014 Code

    P2014 转载自本人Luogu Blog的这篇文章

  • LUOGU 2014 选课 - 树形依赖

    难度 提高Description大学里实行学分制度。每门课程都有一定的学分,学生只要选修了这门课并考核通过就能获得...

  • 树型dp 选课 luoguP2014

    P2014 选课 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在...

  • 2020-09-23 表达式括号匹配

    https://www.luogu.com.cn/problem/P1739[https://www.luogu....

  • c++第七天作业

    1、luogu1423并完成试炼场循环循环循环! 2、luogu陶陶摘苹果。

  • 动态规划

    作为动态规划习题册 目录 1.luogu1417烹调方案[https://www.luogu.com.cn/pro...

  • 90.JXD查看选课结果+事务服务平台查看学生档案信息

    在JXDPT上选课报考,校对选课报考结果是否正确,方法: JXD 平台——选课——本年度学期选课——查看选课结果—...

  • LUOGU3976 AC自动机

    LUOGU3808LUOGU3976Description有个由小写字母组成的模式串以及一个文本串。每个模式串可能...

  • 无标题文章

    一月3号 上午十点开始选课 院系选课 先选专选课 能选的都选两门都选 16分 全校性选课 公选课一节就够了

网友评论

      本文标题:Luogu P2014 选课

      本文链接:https://www.haomeiwen.com/subject/uxokzctx.html