• hdu 5256 序列变换 (LIS变形)


    序列变换

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 519    Accepted Submission(s): 245


    Problem Description
    我们有一个数列A1,A2...An,你如今要求改动数量最少的元素,使得这个数列严格递增。当中不管是改动前还是改动后,每一个元素都必须是整数。
    请输出最少须要改动多少个元素。

     

    Input
    第一行输入一个T(1T10),表示有多少组数据

    每一组数据:

    第一行输入一个N(1N105),表示数列的长度

    第二行输入N个数A1,A2,...,An



    每个数列中的元素都是正整数并且不超过106

     

    Output
    对于每组数据,先输出一行

    Case #i:

    然后输出最少须要改动多少个元素。
     

    Sample Input
    2 2 1 10 3 2 5 4
     

    Sample Output
    Case #1: 0 Case #2: 1
     

    非严格递增时,仅仅须要求最长不降子序列即可了;严格上升,就须要求a[i]-i序列的最长LIS;
    a[j]-a[i]>j-i。即是两个元素不改变须要满足两数之差大于下标之差。

    #include <iostream>
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    #define N 100005
    #define LL __int64
    int a[N];
    int b[N];
    int fun(int n)
    {
        int i,t,cnt=0;
        for(i=0;i<n;i++)
        {
            t=upper_bound(b,b+cnt,a[i])-b;
            //printf("%d 
    ",t);
            if(t==cnt)
                cnt++;
            b[t]=a[i];
        }
        return cnt;
    }
    int main()
    {
        int i,T,n,cnt=1;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
                a[i]-=i;
            }
            printf("Case #%d:%d
    ",cnt++,n-fun(n));
        }
        return 0;
    }
    




  • 相关阅读:
    undo表空间
    SQL*Plus快速入门
    win10用命令net启动服务没权限解决办法
    Oracle表空间管理
    Oracle数据泵(上)
    windows的bat脚本
    Servlet映射细节
    JSP技术(一)
    690. Employee Importance
    BFS和DFS详解以及java实现(转载)
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5215673.html
Copyright © 2020-2023  润新知