题目大意:
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.Input
输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)
Output
对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.
Sample Input
8 389 207 155 300 299 170 158 65Sample Output
2题解:
这个题需要有一个巧妙的转换,不难发现求的就是这个序列的下降子序列个数,然后我们就有两种做法,一种利用set来维护一下序列,每当插入一个数时,如果set里面没有比这个数大的数,那么就插入,即需要一个拦截系统,否则的话就直接
把比他大的那个数删除掉,再把当前这个数删除掉,这样保证了最后放进去的这个数表示了需要一个系统,答案就是最后的set的大小,还有一种比较经典和巧妙的做法,就是转换成求LIS的长度来做,因为最长上升子序列就保证了上升的子序列是间隔最大的,那么每一个间隔之间的都是递减的,即子序列中一个数和后面一个数之间的部分是递减的,就是需要一个导弹拦截系统。
代码实现:
#pragma GCC optimize(2) #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<map> #include<set> #include<stack> #include<queue> #define PI atan(1.0)*4 #define E 2.718281828 #define rp(i,s,t) for (register int i = (s); i <= (t); i++) #define RP(i,t,s) for (register int i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define debug printf("ac\n"); using namespace std; inline int read() { int a=0,b=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') b=-1; c=getchar(); } while(c>='0'&&c<='9') { a=(a<<3)+(a<<1)+c-'0'; c=getchar(); } return a*b; } const int INF = 0x3f3f3f3f; const int N = 1e5+7; int dp[N],a[N]; int main(){ int n; while(~scanf("%d",&n)){ rp(i,1,n) a[i]=read(); int ans=1; rp(i,1,n){ dp[i]=1; rp(j,1,i-1) if(a[j]<a[i]) dp[i]=max(dp[j]+1,dp[i]); ans=max(ans,dp[i]); } cout<<*max_element(dp+1,dp+1+n)<<endl; } return 0; } /* 1 7 3 3 3 6 6 2 2 */
dp训练计划——hdu1257简单dp
猜你喜欢
转载自blog.csdn.net/qq_43472263/article/details/104602968
今日推荐
周排行