序列变换(HDU-5256)LIS
Posted xxmlala-fff
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列变换(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: %d ",i,n-solve()); 26 } 27 return 0; 28 }
以上是关于序列变换(HDU-5256)LIS的主要内容,如果未能解决你的问题,请参考以下文章