传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2577
就是模拟打字,最后一定是大写锁定关掉,求最少的按键次数
dp,f[i][j] 0<=i<=n j=0或1表示到第i个字母大写锁定为关/开的最小按键数
转移方程:
s[i]为小写
f[i][0]=min(f[i-1][0]+1,f[i-1][1]+2);
f[i][1]=min(f[i-1][0]+2,f[i-1][1]+2);
s[i]为大写
f[i][0]=min(f[i-1][0]+2,f[i-1][1]+2);
f[i][1]=min(f[i-1][0]+2,f[i-1][1]+1);
初值 f[0][0]=0,f[0][1]=1;
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n;
char ch[105];
int s[105];
int f[105][2];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%s",ch);
int L=strlen(ch);
for (int i=0;i<L;i++)
{
if (ch[i]>='a' && ch[i]<='z')
{
s[i+1]=0;
}
else
{
s[i+1]=1;
}
}
f[0][0]=0;
f[0][1]=1;
for (int i=1;i<=L;i++)
{
if (!s[i])
{
f[i][0]=min(f[i-1][0]+1,f[i-1][1]+2);
f[i][1]=min(f[i-1][0]+2,f[i-1][1]+2);
}
else
{
f[i][1]=min(f[i-1][0]+2,f[i-1][1]+1);
f[i][0]=min(f[i-1][0]+2,f[i-1][1]+2);
}
}
printf("%d\n",min(f[L][0],f[L][1]+1));
}
return 0;
}