【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.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...
随机推荐
- 前端使用mobx时,变量已经修改了,为什么组件还是没变化,map类型变量,对象类型变量的值获取问题(主要矛盾发生在组件使用时)
前天我在使用一个前端多选框组件时遇到了一个问题,明明对象内的值已经修改了,但是组件显示的还是没有效果改变,以下是当时打出的log,我打印了这个对象的信息 对象内的值已经修改了但是组件还是不能及时更改, ...
- echarts使用方法
1.引入完整版echarts.min.js. 2.为ECharts准备一个具备大小(宽高)的Dom . <div id="main" style="width: 6 ...
- Python中级 —— 07标准库
标准库学习 1. The Python Standard Library[https://docs.python.org/3.5/library/] ( 3.5.5 Documentation ) 1 ...
- Wavesurfer.js音频播放器插件的使用教程
Wavesurfer.js是一款基于HTML5 canvas和Web Audio的音频播放器插件,本文主要记录它及其视觉效果插件Regions插件的使用方法. 1.创建实例 引入插件 import W ...
- 项目-高性能TcpServer - 目录
1.项目-高性能TcpServer - 1.网络通信协议 https://blog.csdn.net/arno1988/article/details/82463225 2.项目-高性能TcpServ ...
- keil5 配置 stm32f103rc 软件仿真
- 20155233 2016-2017-2 《Java程序设计》第9周学习总结
20155233 2016-2017-2 <Java程序设计>第9周学习总结 学习目标 了解JDBC架构 掌握JDBC架构 掌握反射与ClassLoader 了解自定义泛型和自定义枚举 会 ...
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛
A There is a tree with nn nodes, at which attach a binary 64*6464∗64 matrix M_i (1 \le i \le n)M i ...
- 【转】 线段树完全版 ~by NotOnlySuccess
载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...
- Block 在 ARC 下的拷贝
前言 现在有一种说法,是开启arc选项时,已经没有栈上的block了,所以所有的block都不需要copy来拷贝到堆上了.那么这个说法正确与否呢? 结论是这个说法必须是错误的,首先的一点就是arc只是 ...