首页 > 其他 > 详细

CodeForces - 180C Letter (线性DP)

时间:2020-03-31 16:49:40      阅读:60      评论:0      收藏:0      [点我收藏+]

原题

暴露太多问题了,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;
}

CodeForces - 180C Letter (线性DP)

原文:https://www.cnblogs.com/Pecoz/p/12606102.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!