A:因为删除是不计入操作次数的,所以转化一下就是求最长上升子序列,简单dp。
设dp[i]表示前i个字符能凑成上升子序列的最大长度,dp[i] = max(dp[j]+1, dp[i]) 【j < i && s[j] < s[i]】
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define rep(i,a,b) for(int i = a;i <= b;++ i) 4 #define per(i,a,b) for(int i = a;i >= b;-- i) 5 #define mem(a,b) memset((a),(b),sizeof((a))) 6 #define FIN freopen("in.txt","r",stdin) 7 #define IO ios_base::sync_with_stdio(0),cin.tie(0) 8 #define pb push_back 9 typedef long long LL; 10 typedef pair<int, LL> PIR; 11 const int N = 1e6+5; 12 13 string s; 14 int dp[105]; 15 16 int main() 17 { 18 //FIN; 19 cin >> s; 20 int len = s.size(), maxn = 0; 21 rep(i, 1, len){ 22 dp[i] = 1; 23 rep(j, 1, i-1){ 24 if(s[j-1] < s[i-1]) dp[i] = max(dp[j]+1, dp[i]); 25 } 26 maxn = max(maxn, dp[i]); 27 } 28 cout << 26-maxn << endl; 29 return 0; 30 }