zoukankan      html  css  js  c++  java
  • 1010. 拦截导弹(动态规划,最长上升子序列模型)

       解法一:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 30030;
    int a[N], f[N], b[N];
    int n;
    int main() {
        while(cin >> a[n]) n++;
        int res = 0, cnt = 0;
        for(int i = 0; i < n; i++) {
            f[i] = 1;
            for(int j = i - 1; j > - 1; j--) {
                if(a[i] <= a[j]) {
                    f[i] = max(f[i],f[j]+1);
                }
            }
            //贪心流程:
            //从前往后扫描每个数,对于每个数:
            //情况1:如果现有的子序列的结果都小于当前数, 则创建新子序列;
            //情况2: 将当前数放到结尾大于等于它的最小的子序列后面;
            int t = 0;
            while(t < cnt && a[i] > b[t]) t++;
            if(t == cnt) b[cnt++] = a[i];
            else b[t] = a[i];
            res = max(res,f[i]);
        }
        cout << res << endl << cnt << endl;
        return 0;
    }

      解法二:

      

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 30030;
    int a[N], f[N];
    int n;
    int main() {
        while(cin >> a[n]) n++;
        int res = 0;
        for(int i = 0; i < n; i++) {
            f[i] = 1;
            for(int j = i - 1; j > - 1; j--) {
                if(a[i] <= a[j]) {
                    f[i] = max(f[i],f[j]+1);
                }
            }
            res = max(res,f[i]);
        }
        cout << res << endl;
        int res1 = 0;
        for(int i = 0; i < n; i++) {
            f[i] = 1;
            for(int j = i - 1; j > -1; j--) {
                if(a[i] > a[j]) {
                    f[i] = max(f[i],f[j] + 1);
                }
            }
            res1 = max(res1,f[i]);
        }
        cout << res1 << endl;
        return 0;
    }
  • 相关阅读:
    CentOS6设置密码过期时间
    scp
    windows查看进程
    mysql5.7密码问题
    mysql主从切换摘要
    mysql慢日志管理
    Linux学习(一)
    Linux学习(一)
    数据结构与算法(1)-算法时间复杂度
    数据结构与算法(1)-算法时间复杂度
  • 原文地址:https://www.cnblogs.com/yonezu/p/13645751.html
Copyright © 2011-2022 走看看