题目传送门

思路

这道题思维的转换真的很妙,第 i 个外星人出现的时间区间是 [ai,bi][a_i,b_i][ai​,bi​] ,距离为 did_idi​ ,
我们可以以时间区间为横坐标,距离区间为纵坐标考虑。

  • 观察上图,每个外星人可以转换为一条线段,我们要消灭这些外星人等价于竖着画一些线段,这些线段要碰到所有的外星人区间,求线段长度和最小为多少能消灭所有的外星人。
  • 对于一个时间区间 [l,r][l,r][l,r], 我们要消灭这里面的外星人,必须要在区间[l,r]里面里横坐标最远的那个小区间画一条线,即 ddd 最大的那个。然后再看左右子区间需要花费多少才能消灭这些外星人。
  • 所以我们得到状态转移方程 f[l,r]=min(f[l][r],f[l][m−1]+f[m+1][r]+d)f[l,r] = min(f[l][r], f[l][m-1]+f[m+1][r] +d)f[l,r]=min(f[l][r],f[l][m−1]+f[m+1][r]+d), m表示在最远的那个子区间里面的哪个位置画一条线段,ddd 为最远的子区间里面的 ddd。
  • 要注意离散化如果方法不当,可能会超时,也要注意数组不要开小了

AC代码

#include<bits/stdc++.h>
#define rep(i,x,y) for(int i=x; i<=y; ++i)
#define per(i,x,y) for(int i=x; i>=y; --i)
#define pushk push_back
#define emk emplace_back
#define popk pop_back
#define mem(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define ll long long
#define lp p<<1
#define rp p<<1|1
#define IOS ios::sync_stdio(fale),cin.tie(0)
#define INF 0x3f3f3f3f
using namespace std;
const int N = 330;
const int M = 1010;
int f[M][M];
int ff[M*10];
bool vis[M*10];
struct node{int a,b,d;
}nd[N];
int main() {int T;cin>>T;while(T--){int n;scanf("%d",&n);mem(vis,false);mem(f,0);rep(i,1,n){scanf("%d %d %d",&nd[i].a,&nd[i].b,&nd[i].d);vis[nd[i].a]=1,vis[nd[i].b]=1;}int tot=0;//去重离散化 rep(i,1,10001){if(vis[i]) ff[i]=++tot;}rep(i,1,n){nd[i].a=ff[nd[i].a],nd[i].b =ff[nd[i].b];} //f[l][r]=min(f[l][r], f[l][m-1]+f[m+1][r]+d);//枚举区间长度 rep(len,1,tot){rep(j,1,tot-len+1){int l=j,r=j+len-1;int id=-1,d=0;rep(i,1,n){if(nd[i].a >=l && nd[i].b<=r){if(nd[i].d>d)  d=nd[i].d,id=i;    }}if(id==-1) continue;f[l][r]=INF;rep(i,nd[id].a,nd[id].b){f[l][r]=min(f[l][r], f[l][i-1]+f[i+1][r]+d);}} }printf("%d\n",f[1][tot]);} return 0;
}

P4766 [CERC2014]Outer space invaders——思维+区间dp相关推荐

  1. P4766 [CERC2014]Outer space invaders(区间dp)

    题意: 题目描述 来自外太空的外星人(最终)入侵了地球.保卫自己,或者解体,被他们同化,或者成为食物.迄今为止,我们无法确定. 外星人遵循已知的攻击模式.有N个外星人进攻,第i个进攻的外星人会在时间a ...

  2. 【Luogu P4766】 [CERC2014]Outer space invaders(区间dp)

    目录 题目 题目描述 输入格式 输出格式 输入输出样例 思路 代码 题目 题目描述 来自外太空的外星人(最终)入侵了地球.保卫自己,或者解体,被他们同化,或者成为食物.迄今为止,我们无法确定. 外星人 ...

  3. 洛谷P4766 [CERC2014]Outer space invaders题解

    https://www.luogu.com.cn/problem/P4766 description: 有 nnn 个外星人进攻,第 iii 个进攻的外星人会在时间 aia_iai​ 出现,距离你的距 ...

  4. P4766 [CERC2014]Outer space invaders

    自行想象传送门 题解 当我们一看到这个题的tag时就知道这是一道区间dp水题 很明显这个区间就是指时间上的区间 我们用dp[i][j]表示时间i~j之间消灭所有的aliens的最小代价 很明显开不下这 ...

  5. Codeforces Gym100543L:Outer space invaders(区间DP)

    题目链接 题意 有n个人,每个人有一个出现时间a和一个开枪时间b和一个距离d,在任意一个时刻,你可以选择炸人,你要炸一个人的花费是和他的距离d,并且所有的已经出现并且还没开枪的和你距离<=d的人 ...

  6. CFgym:Outer space invaders(区间dp)

    题意:N个飞船,分别需要在时间[ai,bi]内打它下来,距离你di,每次发射武器消耗的能量为di,问将所有飞船打下来消耗的最小能量. 思路:建立坐标轴,横轴为时间,纵轴为距离,跟那个用最少直线穿过所有 ...

  7. 题解 P4766 【[CERC2014]Outer space invaders】

    link description: 有 nnn 个外星人进攻,第 iii 个进攻的外星人会在时间 aia_iai​ 出现,距离你的距离为 did_idi​ ,它必须在时间 bib_ibi​ 前被消灭, ...

  8. Cerc2014 Outer space invaders

    Cerc2014 Outer spaceinvaders 有N个外星人,第i个外星人会在ai时间出现,离你距离di,并且必须在bi时间之前被消灭.你有一把很NB的武器,攻击范围是个半径为R的圆,R可以 ...

  9. BZOJ3928 [Cerc2014] Outer space invaders

    第一眼,我勒个去...然后看到n ≤ 300的时候就2333了 首先把时间离散化,则对于一个时间的区间,可以知道中间最大的那个一定要被选出来,然后把区间分成左右两份 于是区间DP就好了,注意用左开右开 ...

最新文章

  1. Citrx XenDesktop 7 实施三 配置XenServer
  2. js 对象浅拷贝和深拷贝
  3. tensorflow-读写数据最佳代码组合方式
  4. js string转number_Node.js 和 C++ 之间的类型转换
  5. 史上最能“拜客户教”的公司,是如何做到持续交付的?(第2趴)|DevOps案例研究...
  6. mysql外键引用语法_mysql – 外键语法
  7. 腾讯Android自动化测试实战3.3.3 修改Robotium以支持X5WebView
  8. 编写一份代码,支持多种布署方式
  9. Community找不到Workspace按钮的处理方法
  10. 【剑指offer】29、顺时针打印矩阵
  11. 远古有圆孔的头颅可能是穿越者
  12. 计算机应用水平excel考什么,全国专业技术人员计算机应用能力考试EXCEL2003中文字处理全真模拟试卷(三)...
  13. WCF服务启动时遇到AddressAccessDeniedException
  14. yealink学习笔记20200422UVC协议、usb摄像头抓包
  15. Pandas学习——空值填充
  16. 00 - JavaScript 简介
  17. 怎样用美图秀秀制作一寸照片
  18. HTML生成Word文档,可自定义Word文档页眉、页脚、分页。
  19. 一串代码远程控制电脑关机
  20. 那些年我们在Python掉进的坑——清除不想要的字符

热门文章

  1. css实现简单的头像遮罩效果
  2. MATLAB 打开m文件的时候有如图报错怎么办
  3. 某博物馆最多可容纳500人同时参观,有一个出入口,该出入口一次仅允许一个人通过。
  4. 在jupter中利用Python编程查看pkl文件内容的步骤
  5. 超导计算机国防科技大学,基于约瑟夫森结的超导量子计算研究
  6. cocos2d-x 学习笔记(3)cocos2d-x 创建基本控件 及小动画
  7. 而多乐在线书签导入html文件,,简单介绍HTML5中的文件导入
  8. python爬取网页停止工作_python人员api停止工作
  9. 企业级自动化运维平台
  10. Python中 ‘int‘ object is not subscriptable 问题的可能解决方法