HDU2577 How to Type
2024-09-04 23:37:12
一道 DP 问题
定义 \(\operatorname{dp}(i,j)\) 为敲完第 \(i\) 个字母且当前状态为 \(j\) 的最小花费,\(j=1\) 代表 Caps Lock(大写锁定)打开,\(j=0\) 代表 Caps Lock 关闭,则有:
如果第 \(i\) 个字母为大写:
\[\operatorname{dp}(i,1)=\min(\operatorname{dp}(i-1,0)+2,\operatorname{dp}(i-1,1)+1)\\\operatorname{dp}(i,0)=\min(\operatorname{dp}(i-1,0)+2,\operatorname{dp}(i-1,1)+2)
\]
\]
如果第 \(i\) 个字母为小写:
\[\operatorname{dp}(i,1)=\min(\operatorname{dp}(i-1,0)+2,\operatorname{dp}(i-1,1)+2)\\\operatorname{dp}(i,0)=\min(\operatorname{dp}(i-1,0)+1,\operatorname{dp}(i-1,1)+2)
\]
\]
目标状态为 \(\min(\operatorname{dp}(len,1)+1,\operatorname{dp}(len,0))\),其中 \(len\) 为字符串长度。
完整代码:
#include<bits/stdc++.h>
using namespace std;
int dp[105][2];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
string str;
cin>>str;
int len=str.length();
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
dp[0][1]=1;
for(int i=1;i<=len;i++)
{
if(str[i-1]>='A'&&str[i-1]<='Z')
{
dp[i][1]=min(dp[i-1][0]+2,dp[i-1][1]+1);
dp[i][0]=min(dp[i-1][0]+2,dp[i-1][1]+2);
}
else
{
dp[i][1]=min(dp[i-1][0]+2,dp[i-1][1]+2);
dp[i][0]=min(dp[i-1][0]+1,dp[i-1][1]+2);
}
}
printf("%d\n",min(dp[len][1]+1,dp[len][0]));
}
return 0;
}
提交状态:
最新文章
- 项目管理详细任务(PMBOK2008)
- Ubuntu1604中mysql的登录问题
- 有利于SEO的DIV+CSS的命名规则
- 再谈Newtonsoft.Json高级用法
- How to mount a NFS share?
- SQLSERVER 2012之AlwaysOn -- 一次硬件升级引发的问题
- docker解决数据存储问题的方案
- 通过css3实现开关选择按钮
- Sqli-labs less 34
- 【转】Tarjan&;LCA题集
- 可用与禁用 E:enabled { sRules }
- windbg命令学习4
- poj3974(manacher)
- 1.Why Apache Spark?
- Numpy中Meshgrid函数介绍及2种应用场景
- 51nod1649- 齐头并进-最短路
- 关于Sublime Text 3的几个问题总结
- 面试:C++工厂模式实现
- 《深入应用C++11:代码优化与工程级应用》勘误表
- autofac生命周期入门(如何避免内存泄漏)
热门文章
- Spring中@Autowired、@Resource和@Inject注解的使用和区别
- RF元素定位的例子
- MySQL 学习网站
- Module build failed: Error: Cannot find module &#39;node-sass&#39;
- Windbg Register(寄存器)窗口的使用
- Codeforces Round #606 (Div. 2) E - Two Fairs(DFS,反向思维)
- Qt QThread两种方式的使用:1-继承QThread重写run函数; 2- 继承QObject并moveToThread &;&; 消息和槽在线程和依附线程间的传递
- 腾讯云VPS注意事项
- 对C++11中的`移动语义`与`右值引用`的介绍与讨论
- SKF密码设备研究