标签:hdu min int 2577 大写 DP shift dp 110
题目转自hdu 2577,题目传送门
题目大意:
现给你n个区分大小写的字符串,大小写可用Caps Lock和shift切换(学过计算机的都知道)
但是有一点需要注意(shift是切换,若现在是大写锁定,用shift可切换成小写)
这道题一开始拿的时候,就觉得是n2的dp
但是,转移方程一直没想出来(耗时0.25h)
后来又仔细想想,发现是2n的dp
然后想了想,20min就切了
解题思路:
我们先将字符串做预处理,形成一个01字符串
像这个测试数据:
HELlowORLd
可以转换成这样:
1110001110
然后,就可以写转移方程了
如果目前的字符需要大写,就是这样:
dp[i][0]=min(dp[i-1][0]+1,dp[i-1][1]+1)+1; dp[i][1]=min(dp[i-1][0]+1,dp[i-1][1])+1;
dp[i][0]代表第i个字符,有大写锁定,dp[i][1]代表第i个字符,无大写锁定
若不需要大写,则是这样:
dp[i][0]=min(dp[i-1][1]+1,dp[i-1][0])+1; dp[i][1]=min(dp[i-1][1]+1,dp[i-1][0]+1)+1;
(意思自己理解,暴怒蒟蒻在线虐人)
然后就很简单了,AC代码如下(码风清奇,请勿怪罪)
#include<bits/stdc++.h> using namespace std; char s[110]; int n,t[110],dp[110][2]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { memset(t,0,sizeof(t)); scanf("%s",&s); int l=strlen(s); for(int i=0;i<l;i++) if(s[i]>=65 && s[i]<=90) t[i]=1;//预处理 dp[0][1]=2; if(t[0]==1) dp[0][0]=2; else dp[0][0]=1;//初始化 for(int i=1;i<l;i++) { if(t[i]==1) { dp[i][0]=min(dp[i-1][0]+1,dp[i-1][1]+1)+1; dp[i][1]=min(dp[i-1][0]+1,dp[i-1][1])+1; } else { dp[i][0]=min(dp[i-1][1]+1,dp[i-1][0])+1; dp[i][1]=min(dp[i-1][1]+1,dp[i-1][0]+1)+1; }//转移方程 } printf("%d\n",min(dp[l-1][0],dp[l-1][1]+1));//还需要比较 } return ~~(0-0);//装个13 }
就这样,这道题就可以轻松AC了......
dp之旅,未完待续.......
标签:hdu,min,int,2577,大写,DP,shift,dp,110 来源: https://www.cnblogs.com/juruo-hxy/p/11962510.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。