CodeForces - 180C Letter (线性DP)

原题

暴露太多问题了,DP也不会...

题意:给你一个由大小写字母组成的字符串,你每次可以将大小写修改,问你最少几次修改,可以使这个字符串前缀是大写,后缀是小写

首先我们定义一个数组 dp1[N],它代表从前往后遍历,结尾为 a[i]的字符串最小修改次数;

后我们再定义一个数组 dp2[N],它代表从后往前遍历,结尾为 a[i]的字符串最小修改次数;

最后我们对整个字符串暴力比较出最小的 dp1[i]+dp2[i] 就可以了。

#include<bits/stdc++.h>
using namespace std;
char a[100005];
int dp1[100005],dp2[100005];
int main()
{
    while(~scanf("%s",a+1))
    {
       memset(dp1,0,sizeof(dp1));
       memset(dp2,0,sizeof(dp2));
       int n=strlen(a+1);
       for(int i=2;i<=n;i++)
       {
          if('a'<=a[i-1]&&a[i-1]<='z')
            dp1[i]=dp1[i-1]+1;
          else
            dp1[i]=dp1[i-1];
       }
       for(int i=n-1;i>=1;i--)
       {
          if('a'<=a[i+1]&&a[i+1]<='z')
            dp2[i]=dp2[i+1];
          else
            dp2[i]=dp2[i+1]+1;
       }
//       printf("%d %d\n",dp1[1],dp2[1]);
       int ans=1e7;
       for(int i=1;i<=n;i++)
       {
           ans=min(ans,dp1[i]+dp2[i]);
       }
       printf("%d\n",ans);
    }
return 0;
}
posted @ 2020-03-31 16:32  Pecoz  阅读(162)  评论(0编辑  收藏  举报