hdu 5256 LIS变形

给一个数列,问最少修改多少个元素使数列严格递增。如果不是要求“严格”递增,那就是求最长不降子序列LIS,然后n-LIS就是答案。要严格递增也好办,输入的时候用每个数减去其下标处理一下就行了。

/*

 * Author    : ben

 */

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>

#include <ctime>

#include <iostream>

#include <algorithm>

#include <queue>

#include <set>

#include <map>

#include <stack>

#include <string>

#include <vector>

#include <deque>

#include <list>

#include <functional>

#include <numeric>

#include <cctype>

using namespace std;

const int MAXN = 100010;

int a[MAXN];

vector<int> v;

int work() {

    int n;

    scanf("%d", &n);

    v.clear();

    vector<int>::iterator it;

    for (int i = 0; i < n; i++) {

        scanf("%d", &a[i]);

        a[i] = a[i] - (i + 1); //每一个数减去其所在位置的序号

    }

    v.push_back(a[0]);

    for (int i = 1; i < n; i++) {

        if (a[i] >= *(v.end() - 1)) {

            v.push_back(a[i]);

        } else {

            it = upper_bound(v.begin(), v.end(), a[i]);

            *(it) = a[i];

        }

    }

    return n - v.size();

}

int main() {

    int T;

    scanf("%d", &T);

    for (int t = 1; t <= T; t++) {

        printf("Case #%d:\n%d\n", t, work());

    }

    return 0;

}

 

你可能感兴趣的:(HDU)