码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-11-03 20:18:15      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:std   size   print   ios   变换   次数   一个   题意   for   

题目链接: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 }

 

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

标签:std   size   print   ios   变换   次数   一个   题意   for   

原文地址:https://www.cnblogs.com/xxmlala-fff/p/11788604.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!