HDOJ 1257 LIS

题目大意:

输入N,表示雷达监测到来袭的导弹数目,之后输入每个导弹的发射高度,因为每套系统第一次发射的导弹高度任意高,后续发射的导弹不能高于先前的高度,所以计算打落所有导弹所需要的最小系统数量。

算法思想:

因为每套系统所发射的导弹是非递增的序列,所以只需求出所有来袭导弹的最长上升序列的规模数即为需要的系统数。用dp[i]记录到i的最长上升子序列,状态方程为

dp[i]=max(dp[j])+1 (1=<j<i) .

代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=10000;
int H[MAXN];
bool vis[MAXN];
int dp[MAXN];//记录最大长度
int LIS(int H[],int N){
   int m=0;
   int ans=1;
   dp[1]=1;
   vis[1]=true;
   for(int i=2;i<=N;i++){
       m=0;
       for(int j=1;j<i;j++){
           if(dp[j]>m&&H[j]<H[i]){
                m=dp[j];
           }
       }
       dp[i]=m+1;
       ans=max(ans,dp[i]);
   }
   return ans;
}

int main(){
    int N;
    while(cin>>N){
        for(int i=1;i<=N;i++){
            cin>>H[i];
        }
        cout<<LIS(H,N)<<endl;
    }
    return 0;
}
时间: 2024-11-05 18:32:49

HDOJ 1257 LIS的相关文章

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

hdu 1257 LIS (略坑5

---恢复内容开始--- 最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 38242 Accepted Submission(s): 15029 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不

HDOJ 5141 LIS again 二分

二分求LIS 对每一个位置为终点的LIS记录开头的最靠右边的值.... LIS again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 272    Accepted Submission(s): 96 Problem Description A numeric sequence of ai is ordered if a1<a2<

hdoj 1257(暴力)

最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 53723    Accepted Submission(s): 21061 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高

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 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高

hdoj 1257最少拦截系统

 /*最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 25347    Accepted Submission(s): 9959 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷: 虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超

hdoj 1257 最少拦截系统

最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24450    Accepted Submission(s): 9569 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度

dp入门题目

本文文旨,如题... 转载请注明出处... HDOJ 1176 免费馅饼 http://acm.hdu.edu.cn/showproblem.php?pid=1176 类似数塔,从底往上推,每次都是从下面三个中选最大的 1 #include<cstdio> 2 #include<cstring> 3 #define MAXN 100005 4 int dp[MAXN][11];//第i秒第j个位置的馅饼数 5 int max1(int a,int b) 6 { 7 return a

hdoj 5087 Revenge of LIS II 【第二长单调递增子】

称号:hdoj 5087 Revenge of LIS II 题意:非常easy,给你一个序列,让你求第二长单调递增子序列. 分析:事实上非常easy.不知道比赛的时候为什么那么多了判掉了. 我们用O(n^2)的时间求单调递增子序列的时候,里面在加一层循环维护sum数组.表示前面有几个能够转移当当前,求前面sum的和保存到当前. 最后求最后一个sum[n-1]是否为1就ok.为1的话在最长的基础上减一,否则就是最长的. AC代码: #include <iostream> #include &l