[CQOI2017] 小Q的棋盘(贪心 / 树形dp)

problem

luogu-P3698

solution1-贪心

显然我们想尽可能地少走回头路,即一直往下走。

所以我们可以都会有个初步地猜测是走最长链。

但很快就会想到万一这是一条单链,链中的点都是二度点,走得越深回头浪费的步数也越多。

然后就可能直接把这种想法抛却了。

以上都是脑中不到两分钟的粗略思路,很容易误判。

实际上仔细想想,建议画几个树,就会发现最优解总可以调整成走长链。

当开始走长链的时候,就一定不会走回头路了

考虑一条链,当走到底的时候发现有多余的步数,然后又发现链中某点有多个儿子,我们现在才返回去走一条新链的话,这个浪费的步数就太多了。

所以我们应当是预知有多余的步数,然后再走到那个点的时候,就先走新链,然后再倒回来继续走这条链。

对于新链而言一样按照上面的预知流程执行。

可以感觉地到这是个递归的过程。

但这并不是代码实现,这只是来佐证贪心猜测的正确性的。

这也是网上题解说的 走完最长链上的点后,每两步能到达一个新的点 ,这不是代表着一定是先走完最长链再回头,还是最优解可以将步数和点数按照这种方式对应上。

时间复杂度 O(n)O(n)O(n),所以说出题人完全可以将 nnn 开大点,卡掉 dpdpdp 的做法。

为你的良心点赞👍

code1

#include <bits/stdc++.h>
using namespace std;
#define maxn 105
vector < int > G[maxn];
int n, m, ans;void dfs( int u, int fa, int dep ) {ans = max( ans, dep );for( int v : G[u] ) if( v == fa ) continue;else dfs( v, u, dep + 1 );
}int main() {scanf( "%d %d", &n, &m );for( int i = 1, u, v;i < n;i ++ ) {scanf( "%d %d", &u, &v );G[u].push_back( v );G[v].push_back( u );}dfs( 0, 0, 1 );if( m <= ans ) printf( "%d\n", m + 1 );else printf( "%d\n", min( n, ans + (m - ans + 1) / 2 ) );return 0;
}

solution2-树形dp

这种样子,长得就像个树形 dpdpdp

f(i,j):f(i,j):f(i,j): 在以 iii 为根的子树内,从 iii 开始向下在子树内走了 jjj 步最多经过的节点数。

然后可能就直接从上往下用 fafafafff 更新 uuufff ,此时有新加点;

然后搜索 uuu 子树,完了回来又从下往上更新,此时不会有新加点。

实际上这种做法的正确性必须保证对于一棵树 dfs\text{dfs}dfs 先搜的就是最长链,相当于是跑的贪心。

实在不理解的可以自己写个数据生成器,不用多大 888 以内都能给你排出错误来。

其实问题与贪心思考的一样,就是是否回到这个点来。我们将这个变成第三维。

f(i,j,0/1):0f(i,j,0/1):0f(i,j,0/1):0 不回到 uuu 点,111 回到 uuu 点。

则对于 uuu ,枚举儿子 vvv,以及自己一共在子树内走的步数,和 vvv 在子树内走的步数:
{f(u,i,0)=max⁡{f(u,i−j,1)+f(v,j−1,0),f(u,i−j,0)+f(v,j−2,1)}f(u,i,1)=max⁡{f(u,i−j,1)+f(v,j−2,1)}\begin{cases} f(u,i,0)=\max\Big\{f(u,i-j,1) + f(v,j-1,0),f(u,i-j,0) + f(v,j-2,1)\Big\}\\ f(u,i,1)=\max\Big\{f(u,i-j,1) + f(v,j-2,1)\Big\} \end{cases} f(u,i,0)=max{f(u,ij,1)+f(v,j1,0),f(u,ij,0)+f(v,j2,1)}f(u,i,1)=max{f(u,ij,1)+f(v,j2,1)}
回来的话 u−vu-vuv 这条边就要走两次,所以是 −2-22,否则 −1-11

时间复杂度 O(n3)O(n^3)O(n3)

哪哪儿都比不上贪心好吧

code2

#include <bits/stdc++.h>
using namespace std;
#define maxn 105
vector < int > G[maxn];
int n, m;
int f[maxn][maxn][2];void dfs( int u, int fa ) {f[u][0][1] = f[u][0][0] = 1;for( int v : G[u] )if( v ^ fa ) {dfs( v, u );for( int i = m;i;i -- )for( int j = 1;j <= i;j ++ ) {if( j > 0 ) f[u][i][0] = max( f[u][i][0], f[u][i - j][1] + f[v][j - 1][0] );if( j > 1 ) f[u][i][0] = max( f[u][i][0], f[u][i - j][0] + f[v][j - 2][1] );if( j > 1 ) f[u][i][1] = max( f[u][i][1], f[u][i - j][1] + f[v][j - 2][1] );}}
}int main() {scanf( "%d %d", &n, &m );for( int i = 1, u, v;i < n;i ++ ) {scanf( "%d %d", &u, &v );G[u].push_back( v );G[v].push_back( u );}dfs( 0, 0 );int ans = 0;for( int i = 0;i <= m;i ++ ) ans = max( ans, max( f[0][i][1], f[0][i][0] ) );printf( "%d\n", ans );return 0;
}

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

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

相关文章

ASP.NET Core 进程内(InProcess)托管(6)《从零开始学ASP.NET CORE MVC》:

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core 中的 Main方法ASP.NET Core 进程内(InProcess)托管在这个视频中我们将讨论在ASP.NET Core中的进程内(InProcess)托管模型什么是Kestrel服务器当一个 ASP.NET Core 应用程序执行的时候&#xff0c;.NET…

约会安排 HDU - 4553

约会安排 HDU - 4553 题意&#xff1a; 题意又丑又长就不叙述了 题解&#xff1a; 这个题一开始理解错了。。。题目相当于是有三种情况占据时间&#xff0c;分别是学习&#xff0c;女神和屌丝&#xff0c;我们用不同的lazy来表示女神和屌丝&#xff0c;根据优先级去更新状态…

ML.NET机器学习、API容器化与Azure DevOps实践(一):简介

打算使用几篇文章介绍一下.NET下的机器学习框架ML.NET的具体应用&#xff0c;包括一些常用的业务场景、算法的选择、模型的训练以及RESTful API的创建、机器学习服务容器化&#xff0c;以及基于Azure DevOps的容器化部署等等相关的内容。如果你从来没有玩过机器学习&#xff0c…

[TJOI2011] 书架(线段数优化dp + 单调栈)

problem luogu-P1295 首先可以列出一个暴力 dpdpdp 转移。 设 f(i):f(i):f(i): 到 iii 为止划分若干组&#xff0c;每组最大值的和 的最小值。 然后枚举最后一组&#xff0c;即 iii 所在组的开头 jjj&#xff0c;则 f(i)min⁡{f(j−1)max⁡j≤k≤i{ak}}f(i)\min\Big\{f(j-1…

Picture POJ - 1177(矩形周长并))

Picture POJ - 1177 题目&#xff1a; 多个矩阵相交在一起&#xff0c;问新图形的周长是多少 题解&#xff1a; 参考题解 周长分为两部分&#xff1a;横线和竖线 横线计算方法&#xff1a;现在总区间被覆盖的长度和上一次总区间被覆盖的长度之差的绝对值 那么我们只需要从…

聊一聊C# 8.0中的await foreach

很开心今天能与大家一起聊聊C# 8.0中的新特性-Async Streams,一般人通常看到这个词表情是这样.简单说,其实就是C# 8.0中支持await foreach.或者说,C# 8.0中支持异步返回枚举类型async Task<IEnumerable<T>>.好吧,还不懂?Good,这篇文章就是为你写的,看完这篇文章,你…

【学习笔记】同余最短路

同余最短路是用来解决一类 ∑i1naixi∈[L,R]\sum_{i1}^n a_ix_i\in[L,R]∑i1n​ai​xi​∈[L,R] 问题的方法。 其中 L,RL,RL,R 值非常大&#xff0c;而 nnn 不是很大&#xff0c;大概是接受 O(n2)O(n^2)O(n2) 的范围&#xff0c;xix_ixi​ 是自定义的系数。 先差分一下&#…

Codeforces Round #738 (Div. 2)

Codeforces Round #738 (Div. 2) 文章目录A题解&#xff1a;代码&#xff1a;B题意&#xff1a;题解&#xff1a;代码&#xff1a;C题意&#xff1a;题解&#xff1a;代码&#xff1a;D1题意&#xff1a;题解&#xff1a;代码:题号题目知识点AMocha and MathBMocha and Red and…

ASP.NET Core 实现带认证功能的Web代理服务器

引言最近在公司开发了一个项目&#xff0c;项目部署架构图如下&#xff1a;思路如图中文本所述&#xff0c;公司大数据集群不允许直接访问外网&#xff0c;需要一个网关服务器代理请求&#xff0c;本处服务器A就是边缘代理服务器的作用。通常技术人员最快捷的思路是在服务器A上…

[ZJOI2010] 排列计数(dp + 组合数)

problem luogu-P2606 solution 我们对 i−⌊i2⌋i-\lfloor\frac i2\rfloori−⌊2i​⌋ 远没有 i−2∗i,2∗i1i-2*i,2*i1i−2∗i,2∗i1 敏感&#xff0c;这其实就是个二叉树&#xff0c;而且是个小根堆。 每个点的值都小于左右儿子的值&#xff08;如果有左右儿子&#xff0…

Unfair contest(个人做法)

Unfair contest 题意&#xff1a; 两个人参赛&#xff0c;n个评委打分&#xff0c;去掉s个最高分&#xff0c;去掉t个最低分&#xff0c;剩下分求平均分&#xff0c;平均分大的获胜。你是第n个评委&#xff0c;此时已知前n-1个评委所打分数&#xff0c;现在轮到你打分&#x…

ASP.NET Core 进程外(out-of-process)托管(7)《从零开始学ASP.NET CORE MVC》

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core 进程内(InProcess)托管ASP.NET Core 进程内(InProcess)托管我们先简单回顾下 ASP.NET Core 中,要配置InProcess的服务器&#xff0c;需要在项目文件中添加< AspNetCoreHostingModel >元素&#…

[CQOI2017] 老C的键盘(树形dp + 组合数)

problem luogu-P3757 solution observation:\text{observation}:observation: hi/2−hih_{i/2}-h_ihi/2​−hi​ 的大小关系&#xff0c;其实就是个二叉树的大小关系。 这很类似之前的排列 dpdpdp &#xff0c;迁移过来&#xff0c;我们尝试 f(i,j):if(i,j):if(i,j):i 在子树…

Educational Codeforces Round 112 (Rated for Div. 2)

Educational Codeforces Round 112 (Rated for Div. 2) 题号题目知识点APizzaForcesBTwo TablesCCoin RowsDSay No to PalindromesEBoring Segments尺取线段树FGood GraphLCT(未补)

eShopOnContainers 知多少[10]:部署到 K8S | AKS

1. 引言断断续续&#xff0c;感觉这个系列又要半途而废了。趁着假期&#xff0c;赶紧再更一篇&#xff0c;介绍下如何将eShopOnContainers部署到K8S上&#xff0c;进而实现大家常说的微服务上云。2. 先了解下 Helm读过我上篇文章ASP.NET Core 借助 K8S 玩转容器编排的同学&…

[HEOI2013] SAO(dp + 组合数 + 前缀和)

problem luogu-P4099 solution 两篇前提题解&#xff1a;排列计数&#xff0c;老C的键盘 想必已经看了 CQOI2017 老C的键盘 一题题解了。 这里直接考虑优化状态转移方程。 我们发现 f(u,i),f(v,j)f(u,i),f(v,j)f(u,i),f(v,j)&#xff0c;当枚举 jjj 后&#xff0c;对应的…

cf1555A. PizzaForces

cf1555A. PizzaForces A. PizzaForces 题意&#xff1a; 有三种披萨&#xff0c;第一种有六块&#xff0c;需要花费15分钟&#xff0c;第二种有8块&#xff0c;需要花费20分钟&#xff0c;第三问有10块&#xff0c;需要花费25分钟。 现在要吃x块披萨&#xff0c;问最少时间花…

DI是实现面向切面和面向抽象的前提

DI越来越重要DI就是依赖注入&#xff0c;现在来说&#xff0c;大部分框架都是以DI为基础组件的&#xff0c;每一个框架都有自己的DI组件&#xff0c;像dotnet core&#xff0c;java spring等&#xff0c;也都为自己的框架量身打造了DI工具。面向对象的几个原则依赖倒置原则&…

[CQOI2017] 老C的任务(差分 + 树状数组 / K-D tree)

problem luogu-P3755 solution 这题第一眼矩阵内的点权值和&#xff0c;马上就是 K-D tree\text{K-D tree}K-D tree 不过脑子的敲。 这其实就是个二维数点问题&#xff0c;完全可以树状数组。 将矩阵差分成四个以原点为左下角的矩阵。 然后将基站按 xxx 轴排序&#xff0…

.net core 并发下的线程安全问题

抱歉&#xff0c;其实内容并不如题&#xff01;&#xff01;&#xff01;背景&#xff08;写测试demo所出现的异常&#xff0c;供大家学习与拍砖&#xff09;&#xff1a;.net core webapi项目&#xff0c;做了一个授权的filter&#xff08;真正的生产项目的话&#xff0c;JWT很…