gdfzoj #785 买水果(树上dp)

标签:树上dp
原题链接(其实并没有什么用)
这里写图片描述
这里写图片描述
这里写图片描述

考虑到q比较庞大(10^5级别),我们不能用单个处理询问的方法来解决,这道题的方法是用树上dp来做。我们令f[i][j][0]表示在以i点为根,有j个黑点时白点的最大数量,同理,f[i][j][1]表示在以i点为根,有j个黑点时白点的最小数量。我们不难得到转移方程:

f[x][i+j][0]=min(f[x][i][0]+f[o][j][0])
f[x][i+j][1]=max(f[x][i][1]+f[o][j][1])
注:x表示当前节点,o枚举x所有的儿子,用邻接表实现。
有一个细节问题,i,j都要倒序枚举,否则一个儿子节点会被重复计算。
时间复杂度为O(n^3+n*q),详见代码。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 805
#define INF 1000000000
#define add(u,v) (to[++top]=head[u],head[u]=top,w[top]=v)
#define For(x) for(int h=head[x],o=w[h];h;o=w[h=to[h]])
using namespace std;
int n,i,j,q,x,y,to[maxn],head[maxn],w[maxn],f[maxn][maxn][2],top=0; 
bool vis[maxn],c[maxn],ff;
inline void dfs(int x)
{
    vis[x]=1; f[x][c[x]][0]=f[x][c[x]][1]=1-c[x]; 
    For(x)
        if (!vis[o])
        {
            dfs(o);
            for (i=n;i>=0;i--) if (f[x][i][0]!=INF)
                for (j=n;j>=0;j--) if (f[o][j][0]!=INF)
                    f[x][i+j][0]=min(f[x][i+j][0],f[x][i][0]+f[o][j][0]);
            for (i=n;i>=0;i--) if (f[x][i][1]!=-1)
                for (j=n;j>=0;j--) if (f[o][j][1]!=-1)
                    f[x][i+j][1]=max(f[x][i+j][1],f[x][i][1]+f[o][j][1]);
        } 
}
int main()
{
    scanf("%d%d",&n,&q);
    for (i=1;i<=n-1;i++)
    {
        scanf("%d%d",&x,&y);
        add(x,y); add(y,x);
    }
    for (i=1;i<=n;i++) scanf("%d",&c[i]);
    for (i=1;i<=n;i++) 
        for (j=0;j<=n;j++) f[i][j][0]=INF,f[i][j][1]=-1;
    memset(vis,0,sizeof(vis));
    dfs(1);
    while (q--)
    {
        scanf("%d%d",&x,&y);
        ff=0;
        for (i=1;i<=n;i++)
            if (f[i][y][0]<=x-y&&x-y<=f[i][y][1])
            {
                ff=1; break;
            }
        if (ff) printf("Yes\n");else printf("No\n");
    }
    return 0;
}
【电力系统】单机无穷大电力系统短路故障暂态稳定Simulink仿真(带说明文档)内容概要:本文档围绕“单机无穷大电力系统短路故障暂态稳定Simulink仿真”展开,提供了完整的仿真模型与说明文档,重点研究电力系统在发生短路故障后的暂态稳定性问题。通过Simulink搭建单机无穷大系统模型,模拟不同类型的短路故障(如三相短路),分析系统在故障期间及切除后的动态响应,包括发电机转子角度、转速、电压和功率等关键参数的变化,进而评估系统的暂态稳定能力。该仿真有助于理解电力系统稳定性机理,掌握暂态过程分析方法。; 适合人群:电气工程及相关专业的本科生、研究生,以及从事电力系统分析、运行与控制工作的科研人员和工程师。; 使用场景及目标:①学习电力系统暂态稳定的基本概念与分析方法;②掌握利用Simulink进行电力系统建模与仿真的技能;③研究短路故障对系统稳定性的影响及提高稳定性的措施(如故障清除时间优化);④辅助课程设计、毕业设计或科研项目中的系统仿真验证。; 阅读建议:建议结合电力系统稳定性理论知识进行学习,先理解仿真模型各模块的功能与参数设置,再运行仿真并仔细分析输出结果,尝试改变故障类型或系统参数以观察其对稳定性的影响,从而深化对暂态稳定问题的理解。
本研究聚焦于运用MATLAB平台,将支持向量机(SVM)应用于数据预测任务,并引入粒子群优化(PSO)算法对模型的关键参数进行自动调优。该研究属于机器学习领域的典型实践,其核心在于利用SVM构建分类模型,同时借助PSO的全局搜索能力,高效确定SVM的最优超参数配置,从而显著增强模型的整体预测效能。 支持向量机作为一种经典的监督学习方法,其基本原理是通过在高维特征空间中构造一个具有最大间隔的决策边界,以实现对样本数据的分类或回归分析。该算法擅长处理小规模样本集、非线性关系以及高维度特征识别问题,其有效性源于通过核函数将原始数据映射至更高维的空间,使得原本复杂的分类问题变得线性可分。 粒子群优化算法是一种模拟鸟群社会行为的群体智能优化技术。在该算法框架下,每个潜在解被视作一个“粒子”,粒子群在解空间中协同搜索,通过不断迭代更新自身速度与位置,并参考个体历史最优解和群体全局最优解的信息,逐步逼近问题的最优解。在本应用中,PSO被专门用于搜寻SVM中影响模型性能的两个关键参数——正则化参数C与核函数参数γ的最优组合。 项目所提供的实现代码涵盖了从数据加载、预处理(如标准化处理)、基础SVM模型构建到PSO优化流程的完整步骤。优化过程会针对不同的核函数(例如线性核、多项式核及径向基函数核等)进行参数寻优,并系统评估优化前后模型性能的差异。性能对比通常基于准确率、精确率、召回率及F1分数等多项分类指标展开,从而定量验证PSO算法在提升SVM模型分类能力方面的实际效果。 本研究通过一个具体的MATLAB实现案例,旨在演示如何将全局优化算法与机器学习模型相结合,以解决模型参数选择这一关键问题。通过此实践,研究者不仅能够深入理解SVM的工作原理,还能掌握利用智能优化技术提升模型泛化性能的有效方法,这对于机器学习在实际问题中的应用具有重要的参考价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
### Python 中基于树结构的动态规划实现 #### 背景介绍 动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法[^3]。当涉及到树形结构时,通常会采用一种称为 **树形 DP** 的方法来解决问题。这种方法的核心在于利用树节点之间的父子关系以及递推方程,在遍历过程中逐步构建解决方案。 以下是关于如何在 Python 中实现基于树结构的动态规划的具体说明: --- #### 树形 DP 基本原理 1. **定义状态**: 对于每一个节点 `i`,我们可能需要维护一些与其相关的属性值(例如最大路径和、最小覆盖范围等)。这些值可以通过其子节点的状态转移得到。 2. **状态转移方程**: 利用父节点与子节点的关系建立递推公式。常见的场景包括: - 计算从根到叶子的最大/最短路径; - 找出满足某些约束条件的最佳子树配置; 3. **初始化与边界处理**: 需要特别注意叶节点的情况,因为它们没有子节点可以参与状态转移过程。 4. **后序遍历优先**: 由于树形 DP 往往依赖子节点的结果更新父节点的信息,因此推荐使用深度优先搜索 (DFS) 并按照后序顺序访问各个节点。 --- #### 示例代码:二叉树中的最长递增路径 下面是一个经典的例子——给定一棵二叉树,找到其中任意两个结点之间最长的递增路径长度。 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def longestIncreasingPath(root: TreeNode) -> int: max_len = 0 def dfs(node): nonlocal max_len if not node: return 0 # 初始化当前节点向左、右延伸的最大递增路径长度 left_inc = 0 right_inc = 0 # 左子树探索 if node.left and node.left.val > node.val: left_inc = dfs(node.left) # 右子树探索 if node.right and node.right.val > node.val: right_inc = dfs(node.right) # 更新全局最大值 current_max_path = 1 + max(left_inc, right_inc) max_len = max(max_len, current_max_path) return current_max_path dfs(root) return max_len ``` 上述代码实现了对二叉树中每条递增路径的查找,并记录下最大的一条路径长度。这里采用了 DFS 来逐层深入并返回各分支上的最佳结果[^1]。 --- #### 结合回溯法的应用扩展 尽管动态规划擅长解决计数类或优化目标的问题,但在实际应用中有时也需要借助回溯技术枚举所有可能性后再筛选符合条件者[^2]。两者结合能够更灵活应对不同类型的挑战。 例如对于寻找特定模式匹配的任务来说,先运用回溯穷尽潜在选项集合,再辅以记忆化存储减少冗余运算,则可显著提升效率。 --- #### 总结 综上所述,针对树型数据结构下的动态规划实践主要围绕以下几个方面展开讨论:一是确立清晰的状态表示形式及其相互间联系规律;二是合理安排迭代次序确保逻辑连贯性;三是综合考虑时间空间开销选取合适策略完成最终解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值