一个向量中单调子向量的数量

时间:2015-03-21 11:04:42

标签: c++ arrays

我需要在我的向量或数组中找到许多单调子向量或数组,它不会产生任何关系。例如,我有向量1234421257843,这里我有4个单调子向量...

1. 1 2 3 4 4 
2. 4 4 2 1 
3. 1 2 5 7 8
4. 8 4 3, and number is 4. 

我试过这样的事情,但是没有工作......

int num(std::vector<int> v){
    int p(1),q(1);

    for(int i(0);i<v.size()-1;i++){
        if (v[i] > v[i+1] ) continue;
        else if(v[i] < v[i+1]) continue;
        else p++;
    } return p;
}

1 个答案:

答案 0 :(得分:0)

我相信这可以帮助您在一个向量中找到单调子向量的数量:

int num(const std::vector<int>& v) {
    int p = 0;
    for (int i = 0; i + 1 < v.size(); ) {
        p += (v[i+1] >= v[i]);
        for (++i; (i + 1 < v.size()) && (v[i+1] >= v[i]); ++i) {
        }

        if (i + 1 == v.size())
            return p;
        p += (v[i+1] <= v[i]);
        for (++i; (i + 1 < v.size()) && (v[i+1] <= v[i]); ++i) {
        }
    }
    return p;
}

但是如果你想找到最大的单调子亚向量,你就不需要这个。任务可以在DP(动态编程)的帮助下解决:你需要两个额外的向量a(n)和d(n),其中a(i)/ d(i) - 是最长的上升/下降子向量的长度在位置i处结束:从[0] = 1开始,如果v [i + 1]> 1,则可以容易地计算[i + 1] = a [i] + 1。 v [i]或1另有