题目:
给一个字符串,对字母进行大小写转换,要求:大写字母都要在小写字母前面,求最小操作数。
题解:
用dp,
DP,dp[0][i]表示第i位为大写字母时的最小操作数,dp[1][i] 表示第i位为小写字母时的最小操作数。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
const int N=1e5+1;
int dp[2][N];
int a[N];
//dp[0][i]:记录大写字母
//dp[1][i]:记录小写字母
int main() {
// DdawdDAduaDWdnfuadw
ios::sync_with_stdio(0);
cin.tie(0);
string a;cin>>a;
memset(dp,0,sizeof(dp));
if(isupper(a[0]))dp[1][0]=1;
else dp[0][0]=1;
for(int i=1;i<a.length();++i){
if(isupper(a[i])){
dp[0][i]=dp[0][i-1];
dp[1][i]=min(dp[0][i-1],dp[1][i-1])+1;
}else{
dp[1][i] = min(dp[0][i-1],dp[1][i-1]);
dp[0][i] = dp[0][i-1] + 1;
}
}
cout<<min(dp[0][a.length()-1],dp[1][a.length()-1]);
return 0;
}