博客
关于我
P1273 有线电视网(树形dp)
阅读量:796 次
发布时间:2023-02-26

本文共 1930 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要找到一种方法,使得有线电视网在不亏本的情况下尽可能多地向用户提供观看足球比赛的信号。我们可以使用树形动态规划来解决这个问题。

方法思路

我们可以使用树形动态规划来解决这个问题。具体来说,对于每个节点,我们计算选择其子节点时的最大收益。我们定义f[i][j]表示在节点i选择j个子节点时的最大收益。最后,我们需要找到最大的k,使得f[1][k] >= 0,这样可以确保在不亏本的情况下尽可能多地向用户提供信号。

解决代码

#include 
#include
#include
using namespace std;#define N (3000 + 100)#define res register intinline int read() { int x(0), f(1); char ch; while (!isdigit(ch = getchar())) { if (ch == '-') f = -1; while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); } return f * x;}int head[N], ver[N], nxt[N], edge[N];int f[N][N], n, m;void add(int x, int y, int z) { ver[++tot] = y; nxt[tot] = head[x]; head[x] = tot; edge[tot] = z;}void dfs(int x) { if (x > n - m) return 1; int son = 0; for (res i = head[x]; i; i = nxt[i]) { int y = ver[i]; int tmp = dfs(y); son += tmp; for (res j = son; j > 0; j--) { for (res k = 1; k <= tmp; k++) { if (k <= j) { if (f[x][j] < f[x][j - k] + f[y][k] - edge[i]) { f[x][j] = f[x][j - k] + f[y][k] - edge[i]; } } } } } return son;}int main() { n = read(); m = read(); for (res x = 1; x <= n - m; x++) { int siz = read(); for (res i = 1; i <= siz; i++) { int y = read(), z = read(); add(x, y, z); } } memset(f, ~0x3f, sizeof(f)); for (res i = 1; i <= n; i++) f[i][0] = 0; for (res i = n - m + 1; i <= n; i++) f[i][1] = read(); tot = 0; dfs(1); for (res i = m; i >= 1; i--) { if (f[1][i] >= 0) return printf("%d\n", i), 0; } return 0;}

代码解释

  • 读取输入:首先读取输入数据,建立树的结构。
  • 初始化动态规划表:初始化f数组,其中f[i][0] = 0表示没有选择任何子节点时的收益。
  • 递归计算收益:使用递归函数dfs计算每个节点的最大收益。对于每个节点,遍历其子节点,计算选择不同数量子节点时的最大收益。
  • 输出结果:从根节点开始,找到最大的k,使得f[1][k] >= 0,表示在不亏本的情况下最多可以向k个用户提供信号。
  • 转载地址:http://idvfk.baihongyu.com/

    你可能感兴趣的文章
    Tensorflow.python.framework.errors_impl.ResourceExhaustedError:无法分配内存[操作:AddV2]
    查看>>
    TCP基本入门-简单认识一下什么是TCP
    查看>>
    tableviewcell 中使用autolayout自适应高度
    查看>>
    Symbolic Aggregate approXimation(SAX,符号聚合近似)介绍-ChatGPT4o作答
    查看>>
    Orcale表被锁
    查看>>
    svn访问报错500
    查看>>
    sum(a.YYSR) over (partition by a.hy_dm) 不需要像group by那样需要分组函数。方便。
    查看>>
    ORCHARD 是什么?
    查看>>
    Struts2中使用Session的两种方法
    查看>>
    Stream API:filter、map和flatMap 的用法
    查看>>
    STM32工作笔记0032---编写跑马灯实验---寄存器版本
    查看>>
    ssm旅游信息管理系统的设计与实现bus56(程序+开题)
    查看>>
    order by rand()
    查看>>
    SSM(Spring+SpringMvc+Mybatis)整合开发笔记
    查看>>
    ViewHolder的改进写法
    查看>>
    Orderer节点启动报错解决方案:Not bootstrapping because of 3 existing channels
    查看>>
    org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement profile
    查看>>
    sql查询中 查询字段数据类型 int 与 String 出现问题
    查看>>
    org.apache.commons.beanutils.BasicDynaBean cannot be cast to ...
    查看>>
    org.apache.dubbo.common.serialize.SerializationException: com.alibaba.fastjson2.JSONException: not s
    查看>>