首页 新闻 会员 周边 捐助

随便想的一道题求解

0
悬赏园豆:20 [待解决问题]

给定一棵 n 个点的以 1 为根的无权树 T,现在要给树上的每个节点 i 赋以一个权值 1<=w_i<=V,使得 对于任意的 2<=i<=n,w_i>=w_{fa_i},其中 fa_i 表示节点 i 的父亲节点。求满足条件的赋权值的方案数,答案对 10^9+7 取模。

想问问有没有比 O(nV) 更优的做法捏 /bx

P2441M的主页 P2441M | 初学一级 | 园豆:182
提问于:2024-10-04 17:46
< >
分享
所有回答(1)
0

来自AI:

  1. 首先分析问题
    • 我们可以使用动态规划来解决这个问题。
    • 定义dp[i][j]表示以节点i为根的子树,当节点i的权值为j时的方案数。
    • 对于叶子节点idp[i][j]=1,因为叶子节点的权值可以是1V中的任意一个值。
    • 对于非叶子节点i,它的权值j要满足j >= w_{fa_i},并且它的子节点的权值要满足相应的条件。所以dp[i][j]=\prod_{k\in children(i)} \sum_{l = j}^{V}dp[k][l],其中children(i)表示节点i的子节点集合。
  2. 然后考虑优化
    • 直接按照上述动态规划的方法计算,时间复杂度是O(nV),因为对于每个节点都要考虑V种权值情况。
    • 我们可以进行如下优化:
      • 对于每个节点i,计算sum[i][j]=\sum_{l = j}^{V}dp[i][l]
      • 当计算dp[i][j]时,可以使用dp[i][j]=\prod_{k\in children(i)} sum[k][j]
      • 在更新sum[i][j]时,可以使用sum[i][j]=sum[i][j + 1]+dp[i][j]
    • 这样,计算dp[i][j]sum[i][j]的时间复杂度都可以降低到O(n),因为对于每个节点只需要O(1)的时间来更新dpsum数组。
    • 总的时间复杂度就从O(nV)优化到了O(n)

以下是使用Python实现的代码示例:

n, V = map(int, input().split())
adj_list = [[] for _ in range(n + 1)]
for _ in range(n - 1):
    u, v = map(int, input().split())
    adj_list[u].append(v)
    adj_list[v].append(u)

dp = [[0] * (V + 1) for _ in range(n + 1)]
sum_dp = [[0] * (V + 1) for _ in range(n + 1)]
mod = 10**9 + 7

def dfs(node, parent):
    for child in adj_list[node]:
        if child!= parent:
            dfs(child, node)
    if len(adj_list[node]) == 1 and node!= 1:  # 叶子节点
        for j in range(1, V + 1):
            dp[node][j] = 1
    else:
        for j in range(1, V + 1):
            product = 1
            for child in adj_list[node]:
                if child!= parent:
                    product = (product * sum_dp[child][j]) % mod
            dp[node][j] = product
    for j in range(V, 0, -1):
        sum_dp[node][j] = (sum_dp[node][j + 1] + dp[node][j]) % mod

dfs(1, -1)
print(sum(dp[1]) % mod)

在上述代码中,首先构建了树的邻接表adj_list,然后使用深度优先搜索dfs来计算dpsum_dp数组,最后输出以根节点为1的满足条件的赋权值方案数对10**9 + 7取模的结果。

中华鲟3670 | 园豆:922 (小虾三级) | 2024-10-05 09:01

这不是 O(n) 吧

支持(0) 反对(0) haozexu | 园豆:200 (初学一级) | 2024-10-05 14:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册