【UVALive 7505】Hungry Game of Ants(DP)
一条链上n只蚂蚁,第i只蚂蚁的weight为i。每只蚂蚁会选择一个初始方向,向左或向右。两只蚂蚁相遇时,大体重的蚂蚁会吃掉小体重蚂蚁,并增加上小体重蚂蚁的体重。如果两只蚂蚁体重相同,左边的会吃掉右边的。最左最右为边界,蚂蚁碰到边界会掉头。
题目大意:
一条链上n只蚂蚁,第i只蚂蚁的weight为i。每只蚂蚁会选择一个初始方向,向左或向右。两只蚂蚁相遇时,大体重的蚂蚁会吃掉小体重蚂蚁,并增加上小体重蚂蚁的体重。如果两只蚂蚁体重相同,左边的会吃掉右边的。最左最右为边界,蚂蚁碰到边界会掉头。
现在给所有蚂蚁定义初始方向,问有多少中方案能让第K只蚂蚁最终存活下来。
首先明确:第K只蚂蚁想要存活,初始方向一定不是向右(除非k == n)
,其次,它会把左边所有蚂蚁吃掉然后掉头。
这样先考虑k吃掉左边蚂蚁并掉头的方案数,其实就是找一个最大的j,满足
即k把j+1到k的蚂蚁都吃掉后,能吃掉1到j合并后剩下的那只蚂蚁。
因为对于每只蚂蚁,向右走一定会被吃掉。所以1~j的蚂蚁可以随意选择方向,并且保证了最坏情况也能被解决。j+1到k-1的蚂蚁都向右(被k吃掉),因为如果有任何一个选择向左,就会与1~j合并,最后变成一只蚂蚁来吃掉k。这样方案就是
然后考虑调头后,对于第i只蚂蚁,如果向左走,有一个可以走的最远(离k最近)的地方j,满足
对于较大的j,这个不等式都满足,对于较小的j,这个条件都不满足。
这样,其实就是j到k-1的蚂蚁随意选择方向,k+1到j-1都要被k吃掉变成一只。即
这样就可以遍历一遍,然后维护一个指针,指向最小的j,每次转移前向右移动到适合的位置,在一个全局的SUM上维护j到i的区间dp值即为dp[i]的值。
需要注意最后答案是dp[n]*2,因为第n个蚂蚁向右走和向左等价。
代码如下:
#include#include #include #include #include #include #include #include #include #include #include #include
#include
- .Net Core权限认证基于Cookie的认证&授权.Scheme、P
- 设计模式 - 七大设计原则(四)- 合成复用原则与设
- 设计模式模式(四):建造者模式(生成器模式) -
- 程序结构设计理论(Android) - 树曲 - 博客园
- 通俗易懂设计模式解析——模板方法模式 - 小世界的
- ASP.NET Core 3.0 : 二十四. 配置的Options模式
- .Net MVC 提示未能加载文件或程序集 - 凉L - 博客园
- C# 多线程与高并发处理并且具备暂停、继续、停止功能
- Fundebug 微信小程序BUG 监控插件更新至 1.3.1,支
- BeautyWe.js 一套专注于微信小程序的开发范式 - 前