zoukankan      html  css  js  c++  java
  • 动态规划 导弹拦截

    题意:一种导弹拦截系统的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉

    到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高

    度,计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统?

     第一问思路非常简单,不断改变终止点的位置,更新dp数组。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    int dp[1010],a[1010];
    int main()
    {
        int cases;
        cin>>cases;
        while(cases--)
        {
            memset(dp,0,sizeof(dp));
            int n;
            cin>>n;
            for(int i=0;i<n;i++)
                scanf("%d",&a[i]);
            dp[0]=1;//最小子序列一定是1,没有更小的了
            for(int i=1;i<n;i++)
            for(int j=0;j<i;j++)
            if(a[i]<a[j]&&dp[j]+1>dp[i]){dp[i]=dp[j]+1;}
            cout<<*max_element(dp,dp+n)<<endl;
        }
    }

    第二问难度比较大

    我们把第二问的问题抽象出来,那就是:把一个数列划分成最少的最长不升子序列。

    Dilworth定理

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    int dp[1010],a[1010];
    int main()
    {
        int cases;
        cin>>cases;
        while(cases--)
        {
            int n;
            cin>>n;
            fill(dp,dp+n,1);
            for(int i=0;i<n;i++)
                scanf("%d",&a[i]);
            dp[0]=1;//最小子序列一定是1,没有更小的了
            for(int i=1;i<n;i++)
            for(int j=0;j<i;j++)
            if(a[j]<a[i]&&dp[j]+1>dp[i]){dp[i]=dp[j]+1;}//changes;
            cout<<*max_element(dp,dp+n)<<endl;
        }
    }

    思路就是从头录到tail,能摁在一块的安一快。

  • 相关阅读:
    点击事件
    php if语句判定my查询是否为空
    php if语句判定ms查询是否为空
    thinkphp 原生sql使用分页类
    从JAVA客户端访问Redis示例(入门)
    Log4j日志级别
    网页正文抽取(包含提取图片)
    网络爬虫基本原理
    Java中替换HTML标签的方法代码
    Java/Js下使用正则表达式匹配嵌套Html标签
  • 原文地址:https://www.cnblogs.com/masterchd/p/6682796.html
Copyright © 2011-2022 走看看