基站选址

看这篇题解

update 2024.7.5

重新做了一遍题目,差一点做出这道题目了

我的想法是,先考虑所有村庄都要赔偿,然后考虑在哪些村庄安装基站可以得到最多的退款

但是这样显然也要知道最后一个基站建在哪里,但是我们显然不能再开一维表示最后一个基站建在哪里,所以只能认为最后一个基站就建在最后一个村庄

f[i][j]表示前i个村庄,一共建j个基站,并且第i个村庄安装基站可以获得的最多的退款

f[i][j]=max(f[i1][k]+value[k+1][i1])c[i],其中value[k+1][i1]指的是介于ki之间的村庄被i或者k覆盖的村庄的退款

这个时候我们一定要有这个思想(没做出来就是因为没有想到这个思想),数据结构优化DP很重要的一点就是考虑假设我们前面已经维护好了,而现在某一维增加了1,考虑这个增加的1会带来什么改变而不是直接思考全局如何维护,一次性维护完,后面就只查找

这里的话,假设i增加了1,那么显然就是原来只被i覆盖没有被k覆盖而且不能被i+1覆盖的村庄的退款会从能得到变成不能得到,于是我们考虑所有覆盖右端点在i的村庄,设某一个村庄为p,那么对于村庄1~st[p]1st[p]是村庄p的覆盖左端点),都无法获得村庄p的退款,于是直接用线段树修改就好了

题解的话就是不用想这么多,直接DP就好了,维护方法是类似的,总之还是要记住这个重要的思想

update 2024.9.7

重新做一遍,做出来了

注意的点:DP考虑子问题的时候,忽略这个状态之外的点;数据结构优化DP,假设前面已经维护好了,只用维护变化量,所以是在循环过程中加减,而不是一次性就插入一个量之后就不管了(因为这个代码多写了两个小时);线性DP三状态(前i个安装j个但第i个不一定安装,前i个安装j个而且第i个安装,前i个安装j个且第i个可以选择安装或者不安装)

posted @   最爱丁珰  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示