HDU 2577 DP 题解

HDU 2577 DP 题解php

2019-11-30c++

Written by WSYide

1.题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2577spa

2.题目思路: 这道题看上去是一道字符串模拟,虽然我最开始也是这样作的,但正确的作法应该是DP。在你们的认知中,DP应该使用与解决一些相似于石子合并,能量项链那样的题,这道题怎么会用到DP呢??
code

咱们假设dp[i][0]表示如今没开大写锁定,dp[i][1]表示如今开了大写锁定,这样的话就能够推出这样的递推表达式:blog

 

dp[i][1]=min(dp[i-1][1]+2,dp[i-1][0]+2);
dp[i][0]=min(dp[i-1][1]+2,dp[i-1][0]+1);

 

哦,对了,这样几句话以前还要先判断这个字符是否是大写/小写:ci

bool checksmall(char a)
{
    if(a>='a'&&a<='z') return true;
    if(a>='A'&&a<='Z') return false;

}

因此通过这样的更改后的代码就是这个压子的:字符串

if(checksmall(a[i-1]))
{
    dp[i][1]=min(dp[i-1][1]+2,dp[i-1][0]+2); //1 capslock
    dp[i][0]=min(dp[i-1][1]+2,dp[i-1][0]+1);
}
else
{
    dp[i][1]=min(dp[i-1][1]+1,dp[i-1][0]+2);
    dp[i][0]=min(dp[i-1][1]+2,dp[i-1][0]+2);
}

最后给一个福利:it

#include<bits/stdc++.h>
using namespace std;
bool checksmall(char a)
{
    if(a>='a'&&a<='z') return true;
    if(a>='A'&&a<='Z') return false;
}
int dp[100001][2];
int main()
{
    int n;
    char a[100001];
    scanf("%d",&n);
    while(n--)
    {
        memset(dp,0x3f,sizeof(dp));
        cin>>a;
        int l=strlen(a);
        dp[0][0]=0;
        dp[0][1]=1;
        for(int i=1;i<=l;i++)
        {
            if(checksmall(a[i-1]))
            {
                dp[i][1]=min(dp[i-1][1]+2,dp[i-1][0]+2); //1 capslock
                dp[i][0]=min(dp[i-1][1]+2,dp[i-1][0]+1);
            }
            else
            {
                dp[i][1]=min(dp[i-1][1]+1,dp[i-1][0]+2);
                dp[i][0]=min(dp[i-1][1]+2,dp[i-1][0]+2);
            }
        }
        //if(cpos==1) ans++;
        printf("%d\n",min(dp[l][0],dp[l][1]+1));
    }
    return 0;
}
福利:AC代码

谢谢你们!io

相关文章
相关标签/搜索