序列变换(HDU-5256)【LIS】

题目链接:https://vjudge.net/problem/HDU-5256

题意:给一个数列,每一个数都不相同且为整数,现求,最少需要修改多少次才能使该数列为严格上升的。

思路:首先,对于一个严格上升的整数数列a,一定有a[i]>=a[i-1]+1,所以,a[i]-i>=a[i-1]-(i-1),以此为线索,我们生成一个新数列b[i]=a[i]-i,则b[i]>=b[i-1],换句话说,a数列严格递增,等价于b数列不下降,因此,n-b的最长上升子序列长度即为最小修改次数。

代码如下:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 using namespace std;
 6 const int max_v=100010;
 7 const int INF=10000000;
 8 int dp[max_v],n,a[max_v];
 9 
10 int solve(){
11     memset(dp,0x3f,sizeof(dp));
12     for(int i=0;i<n;i++)
13         *upper_bound(dp,dp+n,a[i])=a[i];
14     return (lower_bound(dp,dp+n,0x3f3f3f)-dp);
15 }
16 int main(){
17     int t;
18     scanf("%d",&t);
19     for(int i=1;i<=t;i++){
20         scanf("%d",&n);
21         for(int i=1;i<=n;i++){
22             scanf("%d",&a[i-1]);
23             a[i-1]=a[i-1]-i+1;
24         }
25         printf("Case #%d:\n%d\n",i,n-solve());
26     }
27     return 0;
28 }

 

posted @ 2019-11-03 19:41  xxmlala  阅读(56)  评论(0编辑  收藏