CodeForces 180C Letter

题意:给你一个序列,问你最小变几次使字符串变成前面为大写,后面为小写的字符串。

思路:这是一个简单的选择字符串的每一位变还是不变(我个人还是认为之中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\n",min(dp[len-1][0],dp[len-1][1]));
    }
    return 0;
}

 

posted @ 2018-02-16 20:18  啦啦啦天啦噜  阅读(118)  评论(0编辑  收藏  举报