• POJ1836 Alignment DP


    题目意思很好懂,就是问最少出来多少个是的队中的每一个人都能够看到最左边或者是最右边。

    我们通过枚举没一点作为最高点来求解这个问题,有个要注意的地方就是最高点其实允许有两个,即一个往左看,一个往右看。所以我们就只能够去枚举到左边的最高点,通过搜索去找右边的最高点(这个最高点只要满足高度小于等于我们枚举的点即可)。

    代码如下:

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <map>
    #include <queue>
    #include <vector>
    #include <stack>
    #include <list>
    #include <set>
    #define MAXN 1000
    using namespace std;
    
    int N, L[MAXN+5], R[MAXN+5], seq[MAXN+5];
    
    int cp(int x) {
        int p = x + 1;
        while (seq[p] < seq[x] && p <= N) ++p;
        if (p != N+1) return R[p]+2;
        return R[x]+1;
    }
    
    void solve() {
        int ret = 0x7fffffff;
        memset(L, 0, sizeof (L));
        memset(R, 0, sizeof (R));
        for (int i = 1; i <= N; ++i) {
            for (int j = 1; j < i; ++j) {
                if (seq[j] < seq[i]) {
                    L[i] = max(L[i], L[j]+1);
                }
            }
        }
        for (int i = N; i >= 1; --i) {
            for (int j = i+1; j <= N; ++j) {
                if (seq[j] < seq[i]) {
                    R[i] = max(R[i], R[j]+1);
                }    
            }
        }
        for (int i = 1; i <= N; ++i) {
            ret = min(ret, N-(L[i]+cp(i)));
        }
        printf("%d\n", ret);
    }
    
    int main()
    {
        double x;
        while (scanf("%d", &N) == 1) {
            for (int i = 1; i <= N; ++i) {
                scanf("%lf", &x);
                seq[i] = int(x*100000);
            }
            solve();
        }
        return 0;
    }
  • 相关阅读:
    UVtool 工具解释1
    系统自己提供的 非常方便进行轴向的改变。
    解释脚本语言 计算两个向量的夹角度数。
    转换到正交视图的算法。
    对于 位 的判断我一般都转数组 其实这里有这个很好、
    服务器开启防火墙时千万别忘了开3389!
    j2me笔记
    成为那一小部分人!
    SEO笔记
    Java代码优化方案 J2ME内存优化
  • 原文地址:https://www.cnblogs.com/Lyush/p/2685537.html
Copyright © 2020-2023  润新知