拦截导弹

题意:求最长不上升子序列长度;求一个序列最少分成几个非增子序。

第一问易求,已知序列a,令f[i]为a前i个元素的最长非增子序的长度,则有

f[i]=max{f[i],f[j]+1} (1<=j<=i-1且h[j]>=h[i]).

LIS另有nlogn做法,设g[i]为长度为i的最长不上升结尾最小是什么,二分查找更新次数组可得长度。解本题则可以倒序做LIS。

对于第二问,可以维护一个单调序列,为现有导弹拦截系统的最大高度,顺序处理序列,每次贪心的使用大于该导弹高度最小的来拦截这个导弹,显然这样比使用一个可以拦截更高的系统更优。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int INF=0x3f3f3f3f;
int a[30],f[30],g[30],n; int main()
{
while(~scanf("%d",&a[++n]));
--n;
memset(f,63,sizeof f);
for(int i=n;i>0;--i)//倒序LIS
{
int p=lower_bound(f+1,f+n+1,a[i])-f;
f[p]=a[i];
}
printf("%d\n",lower_bound(f+1,f+n+1,INF)-f-1);
memset(g,63,sizeof g);//初始时可以拦截任意高度的导弹
for(int i=1;i<=n;++i)
{
int p=lower_bound(g+1,g+n+1,a[i])-g;
g[p]=a[i];
}
printf("%d\n",lower_bound(g+1,g+n+1,INF)-g-1);//找到最后一个使用过的
return 0;
}

不难发现,第二问按照贪心的思路打出的实际上是一个nlogn的LIS。这涉及到一个定理。

Dilworth定理:对于一个偏序集,最少链划分等于最长反链长度.

也就是说把一个数列划分成最少的最长不上升子序列的数目就等于这个数列的最长不下降子序列的长度

零件分组 Wooden Sticks

现有一些棍状零件,每个零件都有一定的长度(Li)和重量(Wi)。现在为了加工需要,要将他们分成若干组,使每一组中的零件都能排成一个长度和重量都不下降(若i<j,则Li<=Lj,Wi<=Wj,其中i,j为在同一组中的序号)的序列。请问至少要分成几组?

先按照长度(或重量)双关键字排序,则答案序列一定是该序列的子序。则问题转化为原问题二,问未排序的那一个元素序列最少分成多少最长的非降的子序列。求这个序列的最长非增子序即可。

nlogn的非增序列处理比较复杂,(因为处理到a[i]是,要找到小于该值的最大元素,如果其最小则左移,需要从n到1处理)。可以同第一问一样转化为从右向左做LIS,也可以全部取负数做LIS(废话)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int MAXN=100000+5,INF=0x3f3f3f3f;
struct elem
{
int l,w;
bool operator < (const elem& b)const
{
if(l==b.l)
return w<b.w;
return l<b.l;
}
}e[MAXN];
int n,m;
int f[MAXN]; int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d%d",&e[i].l,&e[i].w);
sort(e+1,e+n+1);
memset(f,63,sizeof f);
for(int i=1;i<=n;++i)
{
int p=lower_bound(f+1,f+n+1,-e[i].w)-f;
f[p]=-e[i].w;
}
printf("%d",lower_bound(f+1,f+n+1,INF)-f-1);
return 0;
}

拦截导弹类问题 (Codevs4888零件分组POJ1065Wooden Sticks)(LIS及其覆盖问题)的更多相关文章

  1. caioj 1083 动态规划入门(非常规DP7:零件分组)(LIS)

    这道题题目给的顺序不是固定的 所以一开始要自己排序,按照w来排序 后来只要看l就可以了 然后求最长下降子序列即可(根据那个神奇的定理,LIS模板里有提到) #include<cstdio> ...

  2. (Java实现) 零件分组

    零件分组(Stick)-动态规划-中高级 Case Time Limit:1000MS Time Limit: 3000MS Memory Limit: 65536K Total Submission ...

  3. [BZOJ2244][SDOI2011]拦截导弹 CDQ分治

    2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec  Memory Limit: 512 MB  Special Judge Description 某国为了防御敌国的导弹 ...

  4. 洛谷——P2093 零件分组

    https://www.luogu.org/problem/show?pid=2093 题目描述 某工厂生产一批棍状零件,每个零件都有一定的长度(Li)和重量(Wi).现在为了加工需要,要将它们分成若 ...

  5. codevs1409 拦截导弹2

    [问题描述]一场战争正在 A 国与 B 国之间如火如荼的展开.B 国凭借其强大的经济实力开发出了无数的远程攻击导弹,B 国的领导人希望,通过这些导弹直接毁灭 A 国的指挥部,从而取得战斗的胜利!当然, ...

  6. 零件分组_DP

    问题 C: 零件分组 时间限制: 1 Sec  内存限制: 64 MB提交: 31  解决: 14[提交][状态][讨论版] 题目描述 某工厂生产一批棍状零件,每个零件都有一定的长度(Li)和重量(W ...

  7. nyoj814_又见拦截导弹_DP

    又见拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦 ...

  8. Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例

    利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...

  9. 【动态规划】拦截导弹_dilworth定理_最长递增子序列

    问题 K: [动态规划]拦截导弹 时间限制: 1 Sec  内存限制: 256 MB提交: 39  解决: 10[提交][状态][讨论版] 题目描述 张琪曼:“老师,修罗场是什么?” 墨老师:“修罗是 ...

随机推荐

  1. Java第三节课总结

    动手动脑1: package ketangceshia;import java.util.Random;public class fuben {    public static void main( ...

  2. JavaDay7(下)

    问题1描述 编写一个方法,返回一个double类型二维数组,数组中的元素通过解析字符串参数获得. 代码实现: public class ArrayParser { public static void ...

  3. 5.Docker Compose 部署 Harbor

    什么是 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源 Docker Dis ...

  4. 【Linux远程连接工具】Xshell、Xftp家庭/学生版(免费使用)

    注:Xshell.Xftp家庭/学生版无需激活,可以免费使用! 1.步骤一: 官网下载地址:https://www.netsarang.com/zh/ 选择[所有下载]->[家庭/学校免费]   ...

  5. 在Spring中使用嵌入式数据库-H2

    Spring3以后开始支持嵌入式数据库,嵌入式数据库目前在市面上有好多种,HSQL,DERBY,H2...今天就主要讲一下h2的使用 对于一个数据库产品来说,主要就是如何存储数据和读取数据了.所谓嵌入 ...

  6. JXLS支持嵌套循环语法的数据导出说明

    今天在试验用Jxls 2.0导出嵌套循环数据时,第二层数据一直没有成功,最后确认是数据源结构不正确所致,现将这两种数据格式进行说明:假设模板中批注有这样两条循环语法: <jx:each(item ...

  7. 一直报找不到function,然后又不为null。最后发现是个数组。哭死。

    今天写代码,报找不到function.然后又不为空.最后发现是类型不对.因为是数组,所以不能用node.function(),而应该用nodeArr[0].function.错用前者会找不到funct ...

  8. 开始自学JAVA了,找到一点有用的资料(不定时更新)

    入门代码https://blog.csdn.net/salmonwilliam/article/details/81952387 高精度https://www.cnblogs.com/downrain ...

  9. Wormholes POJ - 3259 spfa判断负环

    //判断负环 dist初始化为正无穷 //正环 负无穷 #include<iostream> #include<cstring> #include<queue> # ...

  10. 51Nod 1182 完美字符串 (贪心)

    约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写.(也就是说字母F和f)的完美度相同. ...