牛客小白月赛34
A-dd爱科学1.0
题目地址:https://ac.nowcoder.com/acm/contest/11211/A
题目大意:给一个全部为大写字母的字符串,可以将字符串中的任一个字符改为A~Z中任一个字符,问最少需要修改多少次可以将字符串变成非递减的列。
思路:其实就是一个求最大上升子序列的题,只要将字符串的最大非递减子序列求出用字符串的长度减去最大非递减子序列的长度即可,比赛时怎么就没想到呢?。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
typedef long long ll;
int inf=0x3f3f3f3f;
inline int read()
{
int x=0,y=1;
char ch;
ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')y=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*y;
}
int dp[105];
char arr[1000005];
int main()
{
int n,m,ans=0,k;
scanf("%d %s",&n,arr+1);
for(int i=1;i<=n;i++)
{
m=arr[i]-'A';
k=dp[m];
for(int j=0;j<=m;j++)
{
k=max(k,dp[j]+1);
}
dp[m]=k;
}
for(int i=0;i<27;i++)
ans=max(ans,dp[i]);
printf("%d\n",n-ans);
return 0;
}