ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

云云更开心

2022-03-03 22:34:00  阅读:154  来源: 互联网

标签:云云 开心 状态 dep sum times 转移 dp


云题合集

$NOI2020$命运

题目大意$:$

每条边有两个状态$(0,1)$,问满足所有限制$($每一条规定链之间必然有一个$1)$

一眼上去肯定是$dp$,考虑怎么设状态

还是说第一维肯定是节点$x$,那么第二维设置什么合适

我一开始想的是记录哪些被满足,哪些没被满足,显然复杂度过高

我每次转移的时候发现能像树形$dp$一样,通过转移子树,来确定每个边的状态

每次转移可以根据枚举这个边的所有状态,然后得到下一步所有的状态

考虑这个东西,我们可以确定一个状态,那么我们还是可以在第二维确定哪些条件没被满足

只不过,我们可以不记录那个状态到底哪些没被满足,我们可以只记录没被满足的起点最深的在哪

为什么,显然可以得到所有状态,考虑每种状态肯定都有一个没有满足条件的起点最深的条件那么就按这个东西另存一维就好了

到这里,我貌似理解了$dp$本质,大概就是把所有状态归成一类,统计这一类的所有方案数,然后分情况讨论罢了

$dp[x][i]$表示子树$x$的状态已经确定,未满足条件的下端点在子树内部的最大深度是多少

那么就可以转移了,直接考虑着一条边选不选就好了,那么我考虑每一次都能转移到最深的就好了,并且我转移的必须保证以后能转移到最终方案

$dp'[x][i]=\sum_{j=0}^{dep_x}dp[x][i]\times dp[y][j]+\sum_{j=0}^{i}dp[x][i]\times dp[y][j]+\sum_{j=0}^{i-1}dp[x][j]\times dp[y][i]$

后面那个$i-1$是防止深度都是$i$的方案被算两次

到了这,咱们就有$64pts$了

至于正解嘛,这个东西可以线段树合并,毕竟是前缀和...

重写以下式子

$dp'[x][i]=dp[x][i]\times sum[y][dep_x]+dp[x][i]\times sum[y][i]+sum[x][i-1]\times dp[y][i]$

$dp'[x][i]=dp[x][i]\times(sum[y][dep_x]+sum[y][i])+dp[y][i]\times sum[x][i-1]$

这个的话,大概就是一个区间乘$sum[y][dep_x]$

实现的话,也很好说,第一部分先求个$sum[y][dep_x]$.递归到最底层然后乘上这个东西

上面的两个$sum$显然是可以在递归时候累加的

 

标签:云云,开心,状态,dep,sum,times,转移,dp
来源: https://www.cnblogs.com/Eternal-Battle/p/15962200.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有