DP刷题(1500-1700)

1.区间DP:https://www.acwing.com/problem/content/323/

比较容易想到区间DP,转换一下均方差定义用记忆化搜索就可以了。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 16;
int n, m = 8;
int s[N][N];
double f[N][N][N][N][N];
double X;
double get(int x1, int y1, int x2, int y2)
{double delta = s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];delta = delta - X;return delta * delta;
}
double dp(int k, int x1, int y1, int x2, int y2)
{if (f[k][x1][y1][x2][y2] >= 0) return f[k][x1][y1][x2][y2];if (k == n) return f[k][x1][y1][x2][y2] = get(x1, y1, x2, y2); double t = 1e9; //初始化为无穷大for (int i = x1; i < x2; i ++ ) //横着切{t = min(t, dp(k + 1, x1, y1, i, y2) + get(i + 1, y1, x2, y2));t = min(t, dp(k + 1, i + 1, y1, x2, y2) + get(x1, y1, i, y2));}for (int i = y1; i < y2; i ++ ) //竖着切{t = min(t, dp(k + 1, x1, y1, x2, i) + get(x1, i + 1, x2, y2));t = min(t, dp(k + 1, x1, i + 1, x2, y2) + get(x1, y1, x2, i));}return f[k][x1][y1][x2][y2] = t;
}
int main()
{cin>>n;for (int i = 1; i <= m; i ++ )for (int j = 1; j <= m; j ++ )cin>>s[i][j];for (int i = 1; i <= m; i ++ )for (int j = 1; j <= m; j ++ )s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];memset(f, -1, sizeof f);X = (double) s[m][m] / n;printf("%.3lf\n", sqrt(dp(1, 1, 1, m, m) / n));return 0;
}

2.树形/换根DP:https://www.acwing.com/problem/content/1075/

我们不妨以1为根建树。

对于任意一个点X,他的最长距离就是max(d1[x],up[x]),其中d1是它向下的最长链,up是它向上的最长链,对于d1,我们只需要用儿子节点更新父节点即可,关键在于up[x]的求法:

首先,我们找到x的父亲k,up[x]=w[x][k]+maxx:这里w[x][k]表示x与k的边权,maxx就是父亲的up[k]和父亲的向下子链的max,这里注意,向下子链不可以穿过x,于是我们用d2[x]维护向下链的次大值,当我们发现最大值穿过时用次大值更新。

所以我们需要知道最大子链是否穿过x,我们只要在第一遍dfs维护root选max时的儿子节点即可。

那么我们怎么实现呢?我们发现这其实是用父节点更新儿子节点的过程,再来一遍DFS即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n;
struct node{int dian;int zhi;
};
int d1[100010],d2[100010],up[100010];
int s1[100010],s2[100010];
vector<node> edge[100010];
void dfs1(int root,int fa){d1[root]=d2[root]=0;for(int i=0;i<edge[root].size();i++){int x=edge[root][i].dian;if(fa==x) continue;dfs1(x,root);if(d1[x]+edge[root][i].zhi>d1[root]){d2[root]=d1[root];d1[root]=d1[x]+edge[root][i].zhi;s1[root]=x;}else if(d1[x]+edge[root][i].zhi>d2[root]){d2[root]=d1[x]+edge[root][i].zhi;}}
}
void dfs2(int root,int fa){for(int i=0;i<edge[root].size();i++){int x=edge[root][i].dian;if(fa==x) continue;//更新儿子up[x]=edge[root][i].zhi;if(s1[root]==x) up[x]+=max(up[root],d2[root]);else up[x]+=max(up[root],d1[root]);dfs2(x,root);}
}
int main(){cin>>n;for(int i=1;i<=n-1;i++){int a,b,c;cin>>a>>b>>c;edge[a].push_back({b,c});edge[b].push_back({a,c});}dfs1(1,-1);dfs2(1,-1);int ans=0x3f3f3f3f;for(int i=1;i<=n;i++){ans=min(ans,max(up[i],d1[i]));}cout<<ans;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现在进行时的被动语态:为什么是 “being“?

在学习英语语法时&#xff0c;曾对现在进行时的被动语态感到困惑&#xff0c;特别是为什么要用“being”这个词。 1. 进行时态&#xff08;Present Continuous Tense&#xff09; 进行时态用于表示动作正在发生。其结构是&#xff1a;主语 am/is/are 动词的现在分词&#xf…

分布式服务框架zookeeper+消息队列kafka

一、zookeeper概述 zookeeper是一个分布式服务框架&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;命名服务&#xff0c;状态同步&#xff0c;配置中心&#xff0c;集群管理等。 在分布式环境下&#xff0c;经常需要对应用/服…

云计算数据中心(三)

目录 四、自动化管理&#xff08;一&#xff09;自动化管理的特征&#xff08;二&#xff09;自动化管理实现阶段&#xff08;三&#xff09;Facebook自动化管理 五、容灾备份&#xff08;一&#xff09;容灾系统的等级标准&#xff08;二&#xff09;容灾备份的关键技术&#…

Oracle19.24发布,打补丁到19.24

一. 19.24发布 2024年7月16日 19c&#xff0c;19.24补丁发布 文档编号19202407.9&#xff0c;文档编码规则&#xff1a; 19&#xff08;版本号&#xff09;2024&#xff08;年份&#xff09;07&#xff08;当季的第一个月01/04/07/10&#xff09;.9 一般每个季度的首月中16…

02-Spring Core中的设计模式分析

Spring Core中的设计模式分析 1. 单例模式 (Singleton Pattern) 源码分析&#xff1a; 在Spring框架中&#xff0c;Bean默认是单例的。这意味着在整个Spring IoC容器中&#xff0c;只有一个Bean实例。Spring通过DefaultSingletonBeanRegistry来实现单例模式。 public class…

Android Launcher3桌面图标样式修改(添加圆角)

1.源码类&#xff1a;LauncherActivityCachingLogic.java /** Copyright (C) 2018 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You…

js修改hash的方法

关键&#xff1a; window.onhashchange (event) > {// do something }hash变化包括 js修改hash手动修改url的hash浏览器前进、后退 js修改hash: location.href "#user";在vue-router等路由组件中如何实现history模式呢&#xff1f; 关键函数&#xff1a;hi…

【学习笔记】Redis学习笔记——第14章 客户端

第14章 服务器 14.1 命令请求的执行过程 14.1.1 发送命令请求 客户端将发送的命令准换成协议格式然后发送给服务器 14.1.2 读取命令请求 1>保存命令至客户端状态输入缓冲区 2>提取命令参数及参数个数保存至客户端状态的argv与argc字段中 3>获取命令执行器并执行命…

Flink CDC 同步表至Paimon 写数据流程,write算子和commit算子。

Flink CDC 同步表至Paimon 写数据流程,write算子和commit算子。(未吃透版) 流程图 一般基本flink cdc 任务同步数据至paimon表时包含3个算子,source、write、global commit。 source端一般是flink connector实现的连接源端进行获取数据的过程,本文探究的是 source算子获…

Haproxy服务

目录 一.haproxy介绍 1.主要特点和功能 2.haproxy 调度算法 3.haproxy 与nginx 和lvs的区别 二.安装 haproxy 服务 1. yum安装 2.第三方rpm 安装 3.编译安装haproxy 三.配置文件详解 1.官方地址配置文件官方帮助文档 2.HAProxy 的配置文件haproxy.cfg由两大部分组成&…

Synchronized升级到重量级锁会发生什么?

我们从网上看到很多&#xff0c;升级到重量锁的时候不会降级&#xff0c;再来线程都是重量级锁 今天我们来实验一把真的是这样的吗 1.首选导入Java对象内存布局的工具库&#xff1a; <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-…

【moyu】河北省职工职业技能大赛决赛

[32m [33mMOYU [32m[0m 工作不算争取价值&#xff0c;是劳动换取酬劳&#xff1b; 工作的时候偷闲才是为自己争取价值。 [32m[0m****************************************************** ******************* 让我摸个鱼吧&#xff01; ******************* *****************…

二叉树---最大二叉树

题目&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums…

web前端 React 框架面试200题(四)

面试题 97. React 两种路由模式的区别&#xff1f;hash和history&#xff1f; 参考回答&#xff1a; 1: hash路由 hash模式是通过改变锚点(#)来更新页面URL&#xff0c;并不会触发页面重新加载&#xff0c;我们可以通过window.onhashchange监听到hash的改变&#xff0c;从而处…

什么是内网穿透?

前言 我们常常会听到“内网穿透”这个术语&#xff0c;但对于很多人来说&#xff0c;它可能还比较陌生。作为一个在网络世界中摸索了一段时间的使用者&#xff0c;我来和大家分享一下我对内网穿透的理解。 目录 一、内网穿透介绍 二、发现 三、特点 四、优势 简单来说&am…

初识godot游戏引擎并安装

简介 Godot是一款自由开源、由社区驱动的2D和3D游戏引擎。游戏开发虽复杂&#xff0c;却蕴含一定的通用规律&#xff0c;正是为了简化这些通用化的工作&#xff0c;游戏引擎应运而生。Godot引擎作为一款功能丰富的跨平台游戏引擎&#xff0c;通过统一的界面支持创建2D和3D游戏。…

web前端 React 框架面试200题(五)

面试题 129. React.forwardRef是什么&#xff1f;它有什么作用&#xff1f; 参考回答&#xff1a; React.forwardRef 会创建一个React组件&#xff0c;这个组件能够将其接受的 ref 属性转发到其组件树下的另一个组件中。这种技术并不常见&#xff0c;但在以下两种场景中特别有…

Git使用技巧

rebase & merge 先说结论&#xff0c;rebase比较适用于私人分支&#xff0c;可以把主干分支上其他人开发的功能拉到自己的分支上&#xff0c;并且是一条线&#xff1b;merge则主要适用于主分支&#xff0c;可以将其他人的代码合并上去&#xff0c;因为要保留主分支的完整历…

opencv读写路径包含中文的文件

读文件 opencv直接读写路径包含中文的文件会出错。这是因为 cv2.imread 内部处理文件路径时&#xff0c;默认使用的是 C 标准库中的字符串处理函数&#xff0c;这些函数对于非 ASCII 字符可能处理不当&#xff0c;导致无法正确读取文件。 1、使用 numpy.fromfi…

JavaWeb笔记_Cookie

一.会话技术概述 在日常生活中,A和B之间在打电话过程中一连串的你问我答就是一个会话 在BS模型中,会话可以理解为通过浏览器访问服务端的资源,点击超链接可以进行资源的跳转,直到浏览器关闭过程叫做会话 我们使用会话技术可以解决的是整个会话过程中(通过浏览器浏览服务…