经过几天的学习发现dp题自己已经有自己的思路,形成了一定得思维模式
每天至少一个dp题坚持下去你就是高手
HDU 2577
思路:对于每个字符串考虑他的两种状态,递推过去,
状态:dp[0][100000] 打开capslocks,dp[1][100000]表示关闭
状态转移方程看代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[2][100001];
int main()
{
int icase;
scanf("%d",&icase);
while(icase--)
{
string s;
cin>>s;
memset(dp,0,sizeof(dp));
if(s[0]>='A'&&s[0]<='Z')
{
dp[0][0] = 2;// cap
dp[1][0] = 2 ;
}
else
{
dp[0][0] = 2;
dp[1][0] = 1;
}
for(int i=1;i<s.size();i++)
{
if(s[i]>='A'&&s[i]<='Z')
{
dp[0][i] = min(dp[0][i-1]+1,dp[1][i-1]+2);
dp[1][i] = min(dp[1][i-1]+2,dp[0][i-1]+2);
}
else
{
dp[0][i] = min(dp[0][i-1]+2,dp[1][i-1]+2);
dp[1][i] = min(dp[1][i-1]+1,dp[0][i-1]+2);
}
}
int n = s.size();
int x = min(dp[0][n-1]+1,dp[1][n-1]);
cout<<x<<endl;
}
}