题目链接:戳这里
题意:给定一个字符串,求将其改成前段全是大写字母,后段全是小写字母最少需要改动的字母数量。
题解:dp[i][0]表示考虑到第i位,且第i位是大写字母时的最小代价,dp[i][1]表示考虑到第i位,且第i位是小写字母时的最小代价。
如果s[i]是大写字母,那么dp[i][0]=dp[i-1][0],dp[i][1]=min(dp[i-1][0],do[i-1][1])+1。
如果s[i]是小写字母,那么dp[i][0]=dp[i-1][0]+1,dp[i][1]=min(dp[i-1][0],dp[i-1][1])。
最后答案为min(dp[n][1],dp[n][0])。
代码:
#include<bits/stdc++.h>
using namespace std;
char s[100005];
int dp[100005][2];
int main()
{
scanf("%s",s+1);int lens=strlen(s+1);
memset(dp,0x3f,sizeof(dp));
dp[0][1]=dp[0][0]=0;
for(int i=1;i<=lens;i++)
{
dp[i][0]=dp[i-1][0]+!isupper(s[i]);
dp[i][1]=min(dp[i-1][0],dp[i-1][1])+isupper(s[i]);
}
printf("%d\n",min(dp[lens][0],dp[lens][1]));
return 0;
}