题目大意:给了一个字符串 可以对它进行若干次操作:删除一个字母,前提是它的左右两边至少有一个是它在字母表中的前一个字母.例如b前面的a,s前面的r.求按照什么顺序删除能删除最多的字母.
模拟一下题目给的样例 bacabcab 从0开始计数可以知道0 4 5 7四个位置是可以被删除的.那么删除哪个呢.显然是删掉最大的那个字母,因为剩下的字母串里面肯定没有因为它而不能删除的字母.题目的规模很小.暴力的模拟一下就好了.
附上代码
#define LL long long
#define pb push_back
#include <iostream>
using namespace std;
const int N = 105;
int n;
int num[N];
int vis[N];
string s;
int main() {
ios::sync_with_stdio(false);
cin >> n;
cin >> s;
int ans = 0;
while (1) {
int mp = -1;
for (int i = 0; i < n; ++i) {
int p = i - 1, ap = i + 1;
if (!vis[i]) {
while (vis[p] && p) p--;
if (i && s[p] == s[i] - 1 && !vis[p]) {
if (mp == -1) mp = i;
else if (s[mp] < s[i]) mp = i;
}
while (vis[ap] && ap < n-1) ap++;
if (i != n-1 && !vis[ap] && s[ap] == s[i] - 1) {
if (mp == -1) mp = i;
else if (s[mp] < s[i]) mp = i;
}
}
}
if (mp == -1) break;
ans++;
vis[mp] = 1;
}
cout << ans;
return 0;
}