hdoj 1257 DP||贪心

最少拦截系统

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 38985    Accepted Submission(s): 15293

Problem Description

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.

Input

输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)

Output

对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.

Sample Input

8 389 207 155 300 299 170 158 65

Sample Output

2

DP思路:dp[N]初始化为1,对于0<=j<i中的a[j]<a[i]的情况取dp[i]=max(dp[i],dp[j]+1)最后dp[]的最大值即为导弹的系统数

贪心思路:答案为v个递减数列的组合,对于每个数列保存一个当前最小值h[j],若下一项大于h[j],则为属于的数列,否则属于已有数列。

DP代码:

 1 #include "cstdio"
 2 #include "algorithm"
 3 #include "cstring"
 4 #include "queue"
 5 #include "cmath"
 6 #include "vector"
 7 #include "map"
 8 #include "stdlib.h"
 9 #include "set"
10 typedef long long ll;
11 using  namespace std;
12 const int N=1e6+5;
13 const int mod=1e9+7;
14 #define db double
15 //int a[N];
16 //set<int> q;
17 //map<int ,int > u;
18 //ll  dp[N];
19 int a[N];
20 int dp[N];
21 int main()
22 {
23     int n;
24     while (scanf("%d",&n)==1){
25         for(int i=0;i<n;i++){
26             scanf("%d",&a[i]);
27         }
28         for(int i=0;i<n;i++){
29             dp[i]=1;
30         }
31         int ans=-1;
32         for(int i=0;i<n;i++){
33             for(int j=0;j<i;j++){
34                 if(a[i]>a[j]){
35                     dp[i]=max(dp[i],dp[j]+1);
36                     ans=max(dp[i],ans);
37                 }
38
39             }
40         }
41         printf("%d\n",ans);
42     }
43     return  0;
44 }

贪心代码:

 1 #include "cstdio"
 2 #include "algorithm"
 3 #include "cstring"
 4 #include "queue"
 5 #include "cmath"
 6 #include "vector"
 7 #include "map"
 8 #include "stdlib.h"
 9 #include "set"
10 typedef long long ll;
11 using  namespace std;
12 const int N=1e6+5;
13 const int mod=1e9+7;
14 #define db double
15 //int a[N];
16 //set<int> q;
17 //map<int ,int > u;
18 //ll  dp[N];
19 int a[N];
20 int h[N];
21 int main()
22 {
23     int n;
24     while (scanf("%d",&n)==1){
25         memset(h,0, sizeof(h));
26         int v=1;
27         for(int i=0;i<n;i++)
28             scanf("%d",&a[i]);
29         h[1]=a[0];
30         for(int i=0;i<n;i++){
31             if(a[i]<=h[v]){
32                 for(int j=1;j<=v;j++){
33                     if(a[i]<=h[j]) {h[j]=a[i];break;}
34                 }
35             }
36             else h[++v]=a[i];
37         }
38         printf("%d\n",v);
39     }
40     return  0;
41 }
时间: 2024-10-10 10:31:25

hdoj 1257 DP||贪心的相关文章

LIS HDOJ 1257 最少拦截系统

题目传送门 1 /* 2 LIS模板题:n - 最长下降子序列 -> 最长上升子序列 贪心做法以后再补:) 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <cstring> 7 #include <string> 8 #include <algorithm> 9 using namespace std; 10 11 const int MAXN = 1e4 + 10; 1

codeforces219C - Color Stripe DP+贪心

题意:给你n,k,大意就是说给你一个已经涂满颜色长为n的字符串,现有k种颜色可以选择,问你最少要改变多少个箱子的颜色使得相邻箱子之间颜色不同. 解题思路:当k = 2 时单独讨论,不能用贪心,其余情况都可贪心得到. 解题代码: 1 // File Name: 219c.cpp 2 // Author: darkdream 3 // Created Time: 2014年07月26日 星期六 15时45分56秒 4 5 #include<vector> 6 #include<list>

ZOJ 2109 FatMouse&#39; Trade (背包 dp + 贪心)

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1109 FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean. The warehouse has N rooms. The i-th room contains J

HDOJ 4349 DP?

尽量沿着边走距离最短,化减后 C(n+1,k)+ n - k, 预处理阶乘,Lucas定理组合数取模 DP? Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 128000/128000 K (Java/Others) Total Submission(s): 1899    Accepted Submission(s): 633 Problem Description Figure 1 shows the Yang Hui Tri

UVALive 4731 dp+贪心

这个题首先要利用题目的特性,先贪心,否则无法进行DP 因为求期望的话,越后面的乘的越大,所以为了得到最小值,应该把概率值降序排序,把大的数跟小的系数相乘 然后这种dp的特性就是转移的时候,由 i推到i+1每次添加一个数,就要考虑这个新数应该和谁放在一组,枚举他放在哪一组即可 dp[i][j]代表当前第i个数有j个分组时候的最小值 dp[i][j]=dp[k][j-1]+i(prefix[i]-prefix[k-1]),k代表枚举第几个数开始和当前新添加的数为一组,prefix为前缀和,为了迅速得

HDU 5303(Delicious Apples- 环上折半dp+贪心)

Delicious Apples Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Total Submission(s): 1585    Accepted Submission(s): 514 Problem Description There are n apple trees planted along a cyclic road, which is L metres

Codeforces 459E Pashmak and Graph(dp+贪心)

题目链接:Codeforces 459E Pashmak and Graph 题目大意:给定一张有向图,每条边有它的权值,要求选定一条路线,保证所经过的边权值严格递增,输出最长路径. 解题思路:将边按照权值排序,每次将相同权值的边同时加入,维护每个点作为终止点的最大长度即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 3

Codeforces 77C 树形dp + 贪心

题目链接:点击打开链接 题意: 给定n个点, 每个点的豆子数量 下面是一棵树 再给出起点 每走到一个点,就会把那个点的豆子吃掉一颗. 问:回到起点最多能吃掉多少颗豆子 思路:树形dp 对于当前节点u,先把子节点v都走一次. 然后再往返于(u,v) 之间,直到u点没有豆子或者v点没有豆子. dp[u] 表示u点的最大值.a[u] 是u点剩下的豆子数. #include <cstdio> #include <vector> #include <algorithm> #inc

uva 1534 - Taekwondo(dp+贪心)

题目连接:uva 1534 - Taekwondo 题目大意:有两组什么东西,题目背景有点忘记了,就是给出两组数,两组个数分别为n,m,要求找出min(n,m)对数,每个数最多最多选一次,使得这min(n,m)对数ai,bi,ai-bi的绝对值之和最小. 解题思路:贪心,将两组数分别排序,然后dp[i][j]表示i对,匹配到j时候的最优解. #include <cstdio> #include <cstring> #include <cmath> #include &l