hdu1257 最少拦截系统(最长上升子序列)
2015-08-24 15:05
239 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1257
思路:
如果知道这么一句话,这题目就好做了:一个序列中,最长上升子序列的长度就是不下降子序列的个数。
那么问题就转化为求最长上升子序列了。
其实也可以用贪心来做:对于当前的导弹来说,如果我当前所有的拦截系统都不能挡住他,那我就要新开一个拦截系统了。
如何贪心?对一个新导弹,就在已有的拦截系统里寻找一个比他高同时最接近他高度的系统。当然系统中记录的是高度最低的那个导弹。
http://acm.hdu.edu.cn/showproblem.php?pid=1257
思路:
如果知道这么一句话,这题目就好做了:一个序列中,最长上升子序列的长度就是不下降子序列的个数。
那么问题就转化为求最长上升子序列了。
#include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b int main() { int n,i,j,a[100005],dp[100005],f; while(scanf("%d",&n)!=EOF) { f=0; int ans=1; for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n;i++) dp[i]=1; for(i=2;i<=n;i++) { for(j=1;j<i;j++) { if(a[i]>a[j]) { dp[i]=max(dp[i],dp[j]+1); } } } int maxx=0; for(i=1;i<=n;i++) { if(maxx<dp[i])maxx=dp[i]; } printf("%d\n",maxx); } return 0; }
其实也可以用贪心来做:对于当前的导弹来说,如果我当前所有的拦截系统都不能挡住他,那我就要新开一个拦截系统了。
如何贪心?对一个新导弹,就在已有的拦截系统里寻找一个比他高同时最接近他高度的系统。当然系统中记录的是高度最低的那个导弹。
#include<stdio.h> #include<string.h> int main() { int x[100005],a[100005],i,j,k,n,u; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); int mini=99999999; x[1]=a[1]; k=1; for(i=2;i<=n;i++) { mini=99999999; for(j=k;j>=1;j--) { if(x[j]>=a[i]&&mini>x[j]-a[i]){ u=j; mini=x[j]-a[i]; } } if(mini==99999999){ x[++k]=a[i]; } else x[u]=a[i]; } printf("%d\n",k); } return 0; }
相关文章推荐
- C++ 构造函数与析构函数详解(一)---局部变量
- Linux命令: find命令的使用方法
- 智能指针
- Chapter 5 OpenStack镜像服务(Image service)
- jquery整理
- ios信息推送 异常 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshak
- Wireshark软件使用教程(上部) 相关选项解释
- 学习软件专业的行话
- 深入理解java异常处理机制
- [Java] cmd命令行如何切换目录
- 局域网中彻底隐身
- 旧电脑重装系统
- Chapter 4 分布式(网络)存储系统
- hdoj 1232 畅通工程【并查集】
- CVPR2015深度学习回顾
- C++虚拟继承与普通继承的区别
- 在VirtualBox中实现主机文件的共享
- Spring实现AOP的4种方式
- java中Timer定时器实现和通过定时器调用url请求
- [LeedCode OJ]#198 House Robber