大一上学期看起来怎么都想不通的dp问题现在已加入一次AC豪华套餐
熟能生巧还真的没说错
dp[i][1]表示的是到了第i个字符串结束的时候保留的是小写的状态
dp[i][2]表示的是到了第i个字符结束的时候保留的是大写的状态
然后简单的推一下状态就可以出来了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[150][2];
int main()
{
char s[200];
int t;cin>>t;
while(t--)
{
cin>>s;
int len=strlen(s);
memset(dp,0,sizeof(dp));
if(s[0]>='a'&&s[0]<='z')
{
dp[0][1]=1;
dp[0][2]=3;
}
else
{
dp[0][1]=2;
dp[0][2]=2;
}
int i;
for(i=1;i<len;i++)
{
if(s[i]>='a'&&s[i]<='z')
{
dp[i][1]=min(dp[i-1][1]+1,dp[i-1][2]+2);
dp[i][2]=min(dp[i-1][1]+2,dp[i-1][2]+2);
}
else
{
dp[i][1]=min(dp[i-1][1]+2,dp[i-1][2]+2);
dp[i][2]=min(dp[i-1][1]+2,dp[i-1][2]+1);
}
}
int los=len-1;
int sum=2222;
if(s[los]>='a'&&s[los]<='z')
{
sum=min(dp[los-1][1]+1,dp[los-1][2]+2);
}
else
{
sum=min(dp[los-1][1]+2,dp[los-1][2]+2);
}
printf("%d\n",sum);
}
return 0;
}