Codeforces Gym100543L Outer space invaders 区间dp 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100543L.html
题目传送门 - CF-Gym100543L
题意
$T$ 组数据。
有 $n$ 个外星人,第 $i$ 个外星人将在 $a_i$~$b_i$ 这段时间内出现,距离你 $d_i$ 。
任何时刻,你可以使用 $R$ 点能量将距离你不超过 $R$ 的所有外星人全部打死。
问你最少使用能量才能干掉所有外星人。
$n\leq 300,\ \ \ \ 1\leq a_i\leq b_i\leq 10000, \ \ \ \ 1\leq d_i\leq 10000$
题解
首先闭着眼睛离散化一下。
考虑优先策划打掉距离你最远的外星人。
你可以在他出现时间的任意一个时间点里打他。
打完他之后,所有出现时间包含你打的时间点的外星人都被顺手打掉了。
于是剩下的问题转化成了两个子问题:打掉所有出现、消失时间都早于你打的时间点的外星人;打掉所有出现、消失时间都晚于你打的时间点的外星人。
于是我们可以区间dp。
建议写记忆化搜索,比较好写。
时间复杂度 $O(n^3)$ 。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=605;
int T,n;
struct Alian{
int L,R,v;
}a[N];
struct Hash_Table{
int Ha[N],hs;
void clear(){hs=0;}
void push(int x){Ha[++hs]=x;}
void HASH(){
sort(Ha+1,Ha+hs+1);
int _hs=1;
for (int i=2;i<=hs;i++)
if (Ha[i]!=Ha[i-1])
Ha[++_hs]=Ha[i];
hs=_hs;
}
int find(int x){return lower_bound(Ha+1,Ha+hs+1,x)-Ha;}
}h;
int dp[N][N];
int solve(int L,int R){
if (~dp[L][R])
return dp[L][R];
int Max=-1;
for (int i=1;i<=n;i++)
if (L<=a[i].L&&a[i].R<=R)
if (Max==-1||a[i].v>a[Max].v)
Max=i;
if (!~Max)
return dp[L][R]=0;
dp[L][R]=1e9;
for (int i=a[Max].L;i<=a[Max].R;i++)
dp[L][R]=min(dp[L][R],a[Max].v+solve(L,i-1)+solve(i+1,R));
return dp[L][R];
}
int main(){
scanf("%d",&T);
while (T--){
scanf("%d",&n);
h.clear();
for (int i=1;i<=n;i++){
scanf("%d%d%d",&a[i].L,&a[i].R,&a[i].v);
h.push(a[i].L);
h.push(a[i].R);
}
h.HASH();
for (int i=1;i<=n;i++){
a[i].L=h.find(a[i].L);
a[i].R=h.find(a[i].R);
}
memset(dp,-1,sizeof dp);
printf("%d\n",solve(1,h.hs));
}
return 0;
}
Codeforces Gym100543L Outer space invaders 区间dp 动态规划的更多相关文章
- BZOJ.3928.[CERC2014]Outer space invaders(区间DP)
BZOJ3928 双倍经验BZOJ4048 Codeforces GYM100543 L \(Description\) \(Solution\) 考虑出现时间在\([l,r]\)内的敌人,设最远的敌 ...
- [BZOJ3928/4048]Outer space invaders
[BZOJ3928/4048]Outer space invaders 题目大意: 有\(n(n\le300)\)个物品,第\(i\)个物品会在\(a_i\sim b_i\)时刻出现,且离你的距离为\ ...
- Codeforces Gym100543L:Outer space invaders(区间DP)
题目链接 题意 有n个人,每个人有一个出现时间a和一个开枪时间b和一个距离d,在任意一个时刻,你可以选择炸人,你要炸一个人的花费是和他的距离d,并且所有的已经出现并且还没开枪的和你距离<=d的人 ...
- Educational Codeforces Round 61 F 思维 + 区间dp
https://codeforces.com/contest/1132/problem/F 思维 + 区间dp 题意 给一个长度为n的字符串(<=500),每次选择消去字符,连续相同的字符可以同 ...
- BZOJ3928 [Cerc2014] Outer space invaders
第一眼,我勒个去...然后看到n ≤ 300的时候就2333了 首先把时间离散化,则对于一个时间的区间,可以知道中间最大的那个一定要被选出来,然后把区间分成左右两份 于是区间DP就好了,注意用左开右开 ...
- Codeforces 508E Arthur and Brackets 区间dp
Arthur and Brackets 区间dp, dp[ i ][ j ]表示第 i 个括号到第 j 个括号之间的所有括号能不能形成一个合法方案. 然后dp就完事了. #include<bit ...
- codeforces 1101F Trucks and Cities 区间dp+单调优化 好题
题目传送门 题意简述:(来自洛谷) 有n个城市坐落在一条数轴上,第ii个城市位于位置ai. 城市之间有m辆卡车穿行.每辆卡车有四个参数:si为起点编号,fi为终点编号,ci表示每行驶1个单位长 ...
- [CERC2014] Outer space invaders
题目链接 题意 你受到一群外星人的攻击,第 $i$ 个外星人会在 $ai$ 时间出现,与你的距离为 $di$,且必须在 $bi$ 时间前消灭.你有一个区域冲击波器,每次攻击可以设定一个功率 $R$,这 ...
- 2018.10.25 bzoj3928: [Cerc2014] Outer space invaders(区间dp)
传送门 区间dpdpdp好题. 首先肯定需要把坐标离散化. 然后在数轴上面区间dpdpdp. 对于当前区间,区间中最大的数一定会被选. 于是我们记f[i,j]f[i,j]f[i,j]表示所有左端点在i ...
随机推荐
- 《python核心编程第二版》课后习题6-12答案
下午脑子瓦特,想了半天也没有想出算法,刚刚抽风终于实现了,特此记录. ̄□ ̄|| 题目 (a)创建一个名字为 findchr()的函数,findchr()要在字符串 string 中查找字符 char, ...
- 28)django-form+ajax实现验证
form+ajax实现验证 #obj.errors返回的是ErrorDict,不是字典(虽然继承字典) #obj.errors.as_json() 返回的字符串(前端要连续反解两次) #obj.err ...
- Oracle Package的全局变量与Session
Oracle Package的全局变量与Session2012-07-26 aaie_ 阅 3595 转 10简单讲,同一个session下pageckage中的全局变量时公共的,会导致冲突.以下是一 ...
- 查看MySQL版本的命令及常用命令
Windows / Linux 系统 前提是已经正确安装了 MySQL,打开 Windows 系统中的命令行工具(Win + R --> 输入 cmd 并按下回车键)--> 输入命令: m ...
- Confluence 6 管理员联系表单的后台配置界面
管理员联系表单的后台配置界面截图和配置. 对输入的数据进行编辑和选择是否启用发送电子邮件给管理员 https://www.cwiki.us/display/CONFLUENCEWIKI/Configu ...
- BIgnum类的程序提交
日期:2018.7.19 星期四 博客期:002 这之前赶着做一个单机游戏的修改器忘了时间,不好意思啊!今天我就把Bignum类的源代码发出来,文件的话,我不知道怎样发,待我好好研究研究这个网站哈!因 ...
- LeetCode(124):二叉树中的最大路径和
Hard! 题目描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不需要经过根节点. 示例 1: 输入: [1, ...
- javaWeb锁屏的简单实现
简单介绍:需求上有个小功能,用户登录后点击用户名,可以点击锁屏,锁屏解除,需要输入正确的密码才能进入管理后台页面enheng(*/ω\*)(*/ω\*)(*/ω\*) 思路简介:其实刚看到要做锁屏,第 ...
- laravel 视图
在实际开发中,除了 API 路由返回指定格式数据对象外,大部分 Web 路由返回的都是视图,以便实现更加复杂的页面交互,我们在前面已经看到过了视图的定义方式: return view('以.分隔的视图 ...
- 原码、补码、反码的概念和java数的存储方式
原码:用符号位和数值位表示一个带符号数,整数符号->0,负数符号->1,数值一般用二进制形式表示 [+10011]原=00010011 [-10011]原=10010011 反码:正 ...