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;
}

 

posted @ 2015-05-31 19:29  moonbay  阅读(183)  评论(0编辑  收藏  举报