【dp】New Keyboard
http://codeforces.com/gym/101397
B
dp[i][j][k]: i为前一个行动的状态,0-switch、1-type,j为当前状态layout的编号,k 是已键入的字符数量。
遍历k,对每个k遍历j: 1..n
dp[0][j % n + 1][k] = min(dp[0][j % n + 1][k], min(dp[0][j][k] + b, dp[1][j][k] + a))
↑ 执行两次,第二遍处理是为了保证n->1之后正确
dp[1][j][k + 1] = min(dp[0][j][k], dp[1][j][k]) + c
最后答案取min(dp[1][1..n][len])
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 2005;
char str[maxn];
bool mark[maxn][26];
int n, a, b, c, len;
ll dp[2][maxn][maxn];
const ll INF = 0x3f3f3f3f3f3f3f3f;
int main() {
	memset(dp, 0x3f, sizeof dp);
	scanf("%d%d%d%d", &n, &a, &b, &c);
	for (int j = 1; j <= n; j++) {
		char s[maxn];
		scanf("%s", s);
		int lens = strlen(s);
		for (int k = 0; k < lens; k++) {
			mark[j][s[k] - 'a'] = true;
		}
	}
	scanf("%s", str);
	len = strlen(str);
	dp[1][1][0] = 0;
	for (int k = 0; k <= len; k++) {
		for (int j = 1; j <= n; j++) {
			dp[0][j % n + 1][k] = min(dp[0][j % n + 1][k], min(dp[0][j][k] + b, dp[1][j][k] + a));
		}
		for (int j = 1; j <= n; j++) {
			dp[0][j % n + 1][k] = min(dp[0][j % n + 1][k], min(dp[0][j][k] + b, dp[1][j][k] + a));
		}
		for (int j = 1; j <= n; j++) {
			if (mark[j][str[k] - 'a']) {
				dp[1][j][k + 1] = min(dp[1][j][k], dp[0][j][k]) + c;
			}
		}
	}
	ll ans = dp[1][1][len];
	for (int j = 2; j <= n; j++) {
		ans = min(ans, dp[1][j][len]);
	}
	printf("%I64d\n", ans == INF ? -1 : ans);
}【dp】New Keyboard的更多相关文章
- Kattis - honey【DP】
		Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ... 
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
		HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ... 
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
		HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ... 
- HDOJ 1257 最少拦截系统 【DP】
		HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ... 
- HDOJ 1159 Common Subsequence【DP】
		HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ... 
- HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】
		HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ... 
- POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】
		POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ... 
- HackerRank - common-child【DP】
		HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ... 
- LeetCode:零钱兑换【322】【DP】
		LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ... 
随机推荐
- 升级Xcode10报错问题修复
			Xcode10 问题1 报文件重复 File--> Workspace Settings --> Build System 修改为Legacy Build System (默认是New B ... 
- 移动端H5页面解决软件键盘把页面顶起
			在input失去焦点的时候加上强制页面归位 window.scroll(0,0); 上代码 <input data-component="SearchInput" type= ... 
- thinkphp+redis实现秒杀,缓存等功能
			秒杀是商城常见功能 php+redis是最常见的秒杀功能 1,安装redis,根据自己的php版本安装对应的redis扩展 首先查看phpinfo();php环境信息 2,下载redis https ... 
- 大数据调错系列之hadoop在开发工具控制台上打印不出日志的解决方法
			(1)在windows环境上配置HADOOP_HOME环境变量 (2)在eclipse上运行程序 (3)注意:如果eclipse打印不出日志,在控制台上只显示 1.log4j:WARN No appe ... 
- 编写Makefile规则
			一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作 ... 
- Navicat 报错1251连接不成功Mysql
			使用Navicat 连接数据库时候出现1251错误,解决方法. 1.首先打开mysql.exe,然后输入密码(mysql.exe可以在安装的位置搜索一下) 2.输入ALTER USER 'root'@ ... 
- android studio 调试技巧(简直太好用)
			android studio 调试技巧(简直太好用) 说到android studio的调试,很多人可能会说,这有什么可讲的不就是一个断点调试么,刚开始我也是这么认为的,直到我了解之后,才发现,调试原 ... 
- nw
			https://github.com/nwjs/nw.js/wiki/List-of-apps-and-companies-using-nw.js 
- 转:c# Linq 的分页[转]
			转:http://www.cnblogs.com/leleroyn/archive/2008/05/14/1196811.html 很多学习Linq的朋友肯定有自己所不同的方法,考虑这个问题我所想到的 ... 
- 20155235 《Java程序设计》 实验二 实验三 敏捷开发与XP实践
			20155235 <Java程序设计> 实验二 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验内容 没有Linux基础的同学建议先学习<Linux基础入 ... 
