(来源于小猴编程)
时间限制:1s内存限制:128M
题目描述
【问题描述】
小明有一个字符串,由小写英文字母组成。
小明准备对他的字符串进行改造,改造的方法是删除字符串中间的一部分字符。小明希望改造完后,新的字符串中的相邻字符都满足左边的字符小于等于右边的字符(a < b < ... < z)。
例如,对于字符串 happy,小明可以删除第一个字母,变成 appy,满足要求。或者小明删除第二字母,变成 hppy,也满足要求。小明还有其他方法使得结果满足要求。再如,对于字符串 autumn,可以删除 3 个字母变成 amn,或者删除 4 个字母变成 at。其他满足要求的方案还有很多。
小明想知道,对于一个字符串,至少要删除多少个字母能满足要求。
输入格式
输入一行包含一个字符串。
输出格式
输出一行,包含一个整数,表示最少要删除的字母个数。
输入样例
输入
happy
输出样例
输出
1
输入样例
输入
autumn
输出样例
输出
3
数据范围
对于100%100%的评测用例,字符串的长度不超过 20。
#include <bits/stdc++.h>
using namespace std;
int get(string s)
{
int n = s.length();
vector<int> dp(n, 1);
int mav = 1;
for (int i = 1; i < n; i++)
{
for (int j = 0; j < i; j++)
{
if (s[j] <= s[i])
{
dp[i] = max(dp[i], dp[j] + 1);
}
}
if (dp[i] > mav)
{
mav = dp[i];
}
}
return n - mav;
}
int main()
{
string s;
cin >> s;
int res = get(s);
cout << res << endl;
return 0;
}
已AC