题解:
在原序列中求一个最长不下降子序列,我们可以想象出不下降子序列的造型类似“0000000000111”
排除掉了中间的1,1中夹着的0以及1后的0,应为我们取的这个子序列时最长的,可以知道
需要变换的部分是最短的,由此可以得到最少的变换次数。然后这个数据范围需要一个O(nlogn)的
算法,利用二分优化O(n^2)普通dp算法即可。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<climits>
#include<iomanip>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define MAXA 100005
#define ipt(x) scanf("%d",&x)
using namespace std;
typedef long long LL;
string s;
int a[MAXA],d[MAXA],Len = 1;
int main() {
getline(cin,s);
for(int i=0;i<s.size();i++)
a[i + 1] = s[i] - '0';
d[1] = a[1];
for(int i=2;i<=s.size();i++) {
if(a[i] >= d[Len])
d[++Len] = a[i];
else {
int j = upper_bound(d + 1,d + Len + 1,a[i]) - d;
d[j] = a[i];
}
}
printf("%d",s.size() - Len);
}