题目

题目描述

mxy 沉迷于一个辣鸡游戏不可自拔。
在游戏中,杀死小兵是有一定的金钱奖赏的,小兵的价值等于它剩余血量。
现在 mxy 与一列敌方小兵在同一直线上,我们用一个数轴表示,假设 mxy 在原点,现
在有 n 个小兵,每个小兵总血量为 m,她们的位置分别在整点坐标 x1, x2, . . . , xn。
现在它们处于一片密集的炮火区,因此,在每个单位时间内每个小兵都会掉一点血。
mxy 的攻击很快,因此当她位于一个小兵面前的时候杀死小兵是不需要时间的,然后她会
得到等于小兵被杀死前剩余血量的金钱数。mxy 在一个单位时间内只能移动一个单位长度。
时间是宝贵的,mxy 想要马上知道对于这一列小兵,她一共能获得多少金钱奖赏。假设在
整个清兵过程中,士兵是不会移动的

输入

第 1 行: 2 个整数 N 和 M。表示小兵个数和小兵总血量。
第 2…N+1 行:第 i 行 1 个整数,表示第 i 个小兵的坐标。

输出

一行一个整数,表示 mxy 得到的最多金钱数。


解题思路

https://blog.csdn.net/Mr_wuyongcong/article/details/90109009

由于士兵在每时每刻都在少血,而它的最终价值还和我们的选择策略,即第几个被杀,前面一共走了多少相关,因此在状态转移方程中计算每个小兵的价值是很困难的。
但如果我们先假设自己一共会杀死k个小兵,目前杀死了x个,那么我们从第x个小兵的位置移到第x+1个小兵的位置的移动时间t中,剩下的k-x个小兵每个血量都会减少t,因此本次移动的实际收益是m-(k-x)t。把未来才会发生的费用提前计算出来。有了这一思路,DP方程就好写了。
然后我们考虑,在我们移动的过程中,跳过一个未死的小兵不砍是绝对不优的,因此我杀死的小兵应该是一个连续的区间。我们先将数据排序,然后用状态[i,j]表示杀死了排序后的第i个小兵到第j个小兵,然而为了区分我们最后杀死的是i还是j,我们用两个数组fi和fj来表示。然后我们要在最后加上一维k,来枚举我们杀死的小兵总数
所以我们的状态是fii,j,k和fji,j,k。
然后以fi[i,j,k]为例。
fi[i,j,k]=max{ fi[i+1][j][k]+m-(dist[i+1]-dist[i])
(k-j+i),fj[i+1][j][k]+m-(dist[j]-dist[i])*(k-j+i)}
即考虑从[i+1,j]状态由i+1走到i和由j走到i中较优的一项。
然后考虑初值。,
fi[i][i][k] = fj[i][i][k] = m – abs(dist[i]) * k
由于在状态转移方程中,变量k在等号的两边虽出现,但没有变化,所以可以在空间上省掉这一维。但时间上仍要枚举k这个阶段变量。
最后考虑答案。枚举k,再枚举i,找最大的max{fi[i,i+k-1], fj[i,i+k-1]}


代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#define rep(i,x,y) for(register int i=x;i<=y;++i)
using namespace std;
const int N=320;
int n,m,a[N],f[N][N][2],ans,t;
int main(){scanf("%d%d",&n,&m); rep(i,1,n) scanf("%d",&a[i]); a[++n]=0; sort(a+1,a+n+1); int t=lower_bound(a+1,a+n+1,0)-a; rep(k,1,n){memset(f,0xcf,sizeof(f)); f[t][t][0]=f[t][t][1]=0; for(int i=t;i>0;--i) rep(j,t,n) {if (i==j) continue;     if (j-i+1>k) break; f[i][j][0]=max(f[i+1][j][0]+m-(a[i+1]-a[i])*(k-j+i),f[i+1][j][1]+m-(a[j]-a[i])*(k-j+i));f[i][j][1]=max(f[i][j-1][1]+m-(a[j]-a[j-1])*(k-j+i),f[i][j-1][0]+m-(a[j]-a[i])*(k-j+i));if (j-i+1==k) ans=max(ans,max(f[i][j][0],f[i][j][1])); } }printf("%d",ans);
}

[nssl 1322][jzoj cz 2109] 清兵线 {dp}相关推荐

  1. [JZOJ]2109 清兵线 题解

    [JZOJ]2109 清兵线 题解 FIRST 题目大意 给你一些正整数,这些正整数为数轴上若干个点代表的数.现求:假设从原点出发,走m以内(包括m)的距离最多能够访问多少个点,输出m-每个点到达时已 ...

  2. 洛谷 P4147 玉蟾宫 题解【悬线dp】

    原题地址 蛤,今天正好学习一下悬线dp,写了个板子题. 用 l [ i ] [ j ] l[i][j] l[i][j]表示能延伸的最左的位置的列, r [ i ] [ j ] r[i][j] r[i] ...

  3. 【JZOJ2109】清兵线【dp】

    题目大意: 题目链接:https://jzoj.net/junior/#main/show/2109 一条数轴上有nnn个特殊格子x1,x2...xnx_1,x_2...x_nx1​,x2​...xn ...

  4. nssl1322,jzoj(初中)2109-清兵线【dp】

    正题 题目大意 nnn个士兵在不同的位置,自己每秒可以往左移或者往右移动1格,并且干掉改格所在的士兵. 有mmm秒,第kkk秒干掉士兵可以获得m−km-km−k的价值,求最大价值之和. 解题思路 离散 ...

  5. SSLOJ 1322.清兵线

    233 题目: 题意: 分析: 代码: 题目: 传送门 题意: 所有小兵都在同一直线上,我们从原点出发,每走一步所有活着的小兵的生命值都会−1-1−1 求如何使收益最大 分析: 假设自己一共杀死kkk ...

  6. JZOJ 6290. 倾斜的线

    题目 Description Input Output Sample Input 6 15698 17433 112412868 636515040 122123982 526131695 58758 ...

  7. 【动态规划】SSL_1322 清兵线

    题意 在一个数轴上有一些小兵,每个小兵在一个单位时间会减少一滴血量,清一个兵得到的金币为这个兵剩下的血量,求从原点如何清兵会得到尽量多的金币. 思路 因为清兵要么一直往一个方向走,要么清到一半退回来, ...

  8. [jzoj 3914]人品问题{树形DP}

    题目 Description 网上出现了一种高科技产品--人品测试器.只要你把你的真实姓名输入进去,系统将自动输出你的人品指数.yzx不相信自己的人品为0.经过了许多研究后,yzx得出了一个更为科学的 ...

  9. JZOJ·滑雪场的缆车【DP】

    JZOJ 1257 滑雪场的缆车 Description-- Input-- Output-- Sample Input-- Sample Output-- 说明-- 解题思路-- 代码-- Desc ...

  10. 2019.5.11 提高B组 T3 nssl-1322 清兵线

    DescriptionDescriptionDescription 在一个数轴上有nnn个点,一开始在原点,走到每个点上可以获得m−tm-tm−t(ttt为移动的距离)的价值,求最大价值 数据范围:n ...

最新文章

  1. java调用存储过程 oracle_java调用oracle存储过程
  2. 硬核!如何在 Github 精准搜索开源项目?
  3. 04-JDBC连接MySQL数据库【修改数据】
  4. oracle函数中bitand,Oracle bitand()函数使用方法
  5. Windows Server 2016之RDS配置证书
  6. .NET 6新特性试用 | 热重载
  7. 计算机中隐藏的文件找不到了怎么办,隐藏文件夹找不到了怎么办【图解】
  8. linux需要多少空间安装mysql_如何安装MySQL
  9. 刷题笔记(2) 将数组中的数字组合成一个最小的数
  10. 聊天机器人最难理解的 10 个词汇
  11. [转载] LeetCode题解(面试16.22):兰顿蚂蚁(Python)
  12. 解决办法:char类型的实参与LPCWSTR类型的形参类型不兼容
  13. 2021-09-14Apriori 算法是基于关联规则的高效数 据挖掘算法
  14. psycopg2 (python与postgresql)
  15. 写一个自己的javascript库
  16. crontab 误删除恢复
  17. 什么软件测试情侣头像,情侣头像搜索另一半 另一半情头查找器在线匹配 - 株洲娱乐网...
  18. 郭霖:手把手教你实现 App 360 度旋转看车效果
  19. LeetCode精选101刷题必备(C++)-附详细分类及解体说明
  20. ipados 蓝牙 android,iPadOS 体验:走出 iOS,iPad 终于能取代 PC 了?

热门文章

  1. 友基-绘影G10数位屏到底是个什么东西呢要不要拆了看看
  2. java解析魔兽争霸3录像_GitHub - wucao/jw3gparser: Java Warcraft Ⅲ Replay Parser(Java解析《魔兽争霸3》游戏录像工具)...
  3. DDR3:MIG控制器设计(vivado)
  4. 编程修养 from匠人的百宝箱
  5. 仿微信 即时聊天工具 - SignalR (一)
  6. 再还校园一个干净、健康的网络环境
  7. 电脑记事本增强版notepad++
  8. java lbs云_LBSyuncunchudemo 一个使用百度地图API,利用LBS云存储云检索的代码,可以测试 。 Java Develop 238万源代码下载- www.pudn.com...
  9. 重庆北大青鸟【学员心声】:转行是痛苦的,但决定是正确的!
  10. 【DIY】自动鱼缸控制系统——【三】