COJ 1050动态规划简单题

来源:互联网 发布:voip网络电话源码 编辑:程序博客网 时间:2024/05/22 21:49

拦截导弹

Time Limit: 1000 ms     Memory Limit: 65536 KB
Total Submit: 528     Accepted: 434

Description
某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。
注意:此题正确率和提交数为按键精灵提交测试所致,不是特别特别的水的题。如果没有把握,慎做!

Input
输入有两行,
第一行,输入雷达捕捉到的敌国导弹的数量k(k<=25),
第二行,输入k个正整数,表示k枚导弹的高度,按来袭导弹的袭击时间顺序给出,以空格分隔。

Output
输出只有一行,包含一个整数,表示最多能拦截多少枚导弹。

Sample Input
8
300 207 155 300 299 170 158 65

Sample Output
6

Hint
1009,1049,1050是同一类型的题目,难度排序1009>1049>1050。

简单的动态规划,因为对动态规划比较怕,所以现在开始攻克这动态规划……一点点进步吧……
#include<iostream>#include<cstdlib>#include<cstdio>#include<algorithm>using namespace std;int main(){    int n,ans=0,i,j,a[1000],f[1000];    cin>>n;    for(i=0; i<n; i++)    {        cin>>a[i];        f[i]=1;    }    for(i=1;i<n;i++)        for(j=0;j<i;j++)            if(a[j]>=a[i]&&f[j]+1>f[i]) f[i]=f[j]+1;  //每个相应的位置都记录下最多的拦截导弹个数,最后找出来最大值即是。    for(i=0; i<n; i++)        if(f[i]>ans) ans=f[i];    cout<<ans<<endl;    return 0;}

原创粉丝点击