题意:给你一个序列,问你最小变几次使字符串变成前面为大写,后面为小写的字符串。
思路:这是一个简单的选择字符串的每一位变还是不变(我个人还是认为之中dp有点偏向于暴力,主要在于dp方程的思考,对于dp的状态也很容易定义,就是长度和是否选择决定的dp的状态)
代码:
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+7; char a[maxn]; int dp[maxn][2]; int main() { while(~scanf("%s",a)){ int len=strlen(a); memset(dp,0,sizeof(dp)); if(a[0]>='A'&&a[0]<='Z')dp[0][1]=1; else dp[0][0]=1; for(int i=1;i<len;i++){ if(a[i]>='A'&&a[i]<='Z'){ dp[i][1]=min(dp[i-1][0],dp[i-1][1])+1; dp[i][0]=dp[i-1][0]; } else{ dp[i][0]=dp[i-1][0]+1; dp[i][1]=min(dp[i-1][1],dp[i-1][0]); } } printf("%d ",min(dp[len-1][0],dp[len-1][1])); } return 0; }