贪心算法:Codevs 1044 拦截导弹

---恢复内容开始---

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;

const int maxn = 100;
vector<int> Bomb;
void solve();

void solve() 
{
    int ans = 0, cnt = 0, high;
    int up[maxn],         //最长上升子序列 
        down[maxn];       //最长下降子序列 
    while (cin >> high) {
        Bomb.push_back(high);
    }
    unsigned len = Bomb.size(); 
    for (unsigned i = 0; i < len; i++) {
        down[i] = 1;
        up[i] = 1;
        for (int j = 0; j < i; j++) {
            if (Bomb[j] > Bomb[i]) {
                down[i] = max(down[i], down[j] + 1);
            }
            if (Bomb[j] < Bomb[i]) {
                up[i] = max(up[i], up[j] + 1);
            }
            ans = max(ans, down[i]);
            cnt = max(cnt, up[i]);
        }
    }
    
    printf("%d
%d
", ans, cnt);    
}

int main()
{
    solve();
    return 0;
} 

主要就是求 最长下降子序列 对应着一个系统最多能拦截的导弹数

        最长上升子序列 对应着 最少需要几个系统 可以全部拦截全部的导弹

因为:

假如某序列完全递减,则最长递增子序列长度为1,即只有一个最长递减子序列。 
假如某序列完全递增,则最长递增子序列长度为n,即有n个最长递减子序列。(n为该序列长度) 
那么对于某序列有增有减,则该序列所形成的严格单调递增序列必然为其每个互相完全不相同单调递减序列的某一个元素共同构成,即对于序列100 68 66 56 78 89 66 20 9,其严格单调递增序列为56 78 89。显然56,78,89永远为三个不同的递减序列中的元素。

假如严格单调递增序列的元素不为不同的递减序列的元素。即某个递减序列贡献了多个元素为严格单调递增序列元素,那么显然这多个元素是单调递增的,与递减序列矛盾。即可证明。

参考了:http://blog.csdn.net/Snow_Me/article/details/47046055

原文地址:https://www.cnblogs.com/douzujun/p/6628409.html