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;
}
戒骄戒躁,百炼成钢!