CodeForces 154A Hometask dp
题目链接:
http://codeforces.com/problemset/problem/154/A
题意:
给你一个字符串,和若干模板串(长度为2),至少删除多少个字母,使得字符串的字串里面没有模板串。
题解:
dp[i][j]表示合法子串s[0...i]的最后一位为j时的最小花费(花费指删除的字母个数)
对每一位考虑删和不删的情况:
如果删,那么它的最后一位一定为之前出现过的。
如果不删,那么s[i]就是最后一位。
考虑这两种情况的转移就可以了。
时间复杂度:O(n*26*26)
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn = 1e5 + ;
const int INF = 0x3f3f3f3f; int dp[maxn][];
int cnt[];
bool mp[][]; char str[maxn];
int len, n; void init() {
memset(dp, 0x3f, sizeof(dp));
memset(mp, , sizeof(mp));
memset(cnt, -, sizeof(cnt));
} inline int f(char c) {
return c - 'a' + ;
} int main() {
while (scanf("%s%d", str, &n) == ) {
init();
len = strlen(str);
char s[];
for (int i = ; i<n; i++) {
scanf("%s", s);
mp[f(s[])][f(s[])] = mp[f(s[])][f(s[])] = ;
}
cnt[f(str[])] = ;
dp[][f(str[])] = ;
for (int i = ; i<len; i++) dp[i][] = i + ;
for (int i = ; i<len; i++) {
int ch = f(str[i]);
cnt[ch] = i;
//第i位删
for (int j = ; j <= ; j++) {
if (cnt[j] != -) {
int k = cnt[j];
dp[i][j] = min(dp[i][j], dp[k][j] + i - k);
}
}
dp[i][ch] = min(dp[i][ch], dp[i - ][]);
//第i位不删
for (int k = ; k <= ; k++) {
if (mp[k][ch] == ) {
dp[i][ch] = min(dp[i][ch], dp[i - ][k]);
}
}
}
int ans = INF;
for (int i = ; i <= ; i++) {
ans = min(ans, dp[len - ][i]);
}
printf("%d\n", ans);
}
return ;
}
CodeForces 154A Hometask dp的更多相关文章
- Codeforces Round #131 (Div. 2) B. Hometask dp
题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...
- codeforces 682D(DP)
题目链接:http://codeforces.com/contest/682/problem/D 思路:dp[i][j][l][0]表示a串前i和b串前j利用a[i] == b[j]所得到的最长子序列 ...
- codeforces 666A (DP)
题目链接:http://codeforces.com/problemset/problem/666/A 思路:dp[i][0]表示第a[i-1]~a[i]组成的字符串是否可行,dp[i][1]表示第a ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- Codeforces 55D (数位DP+离散化+数论)
题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. ...
- Codeforces 264B 数论+DP
题目链接:http://codeforces.com/problemset/problem/264/B 代码: #include<cstdio> #include<iostream& ...
- CodeForces 398B 概率DP 记忆化搜索
题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...
- CodeForces 512B(区间dp)
D - Fox And Jumping Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64 ...
- CodeForces - 1051D Bicolorings(DP)
题目链接:http://codeforces.com/problemset/problem/1051/D 看了大佬的题解后觉着是简单的dp,咋自己做就做不来呢. 大佬的题解:https://www.c ...
随机推荐
- 自定义loading效果
结合Font Awesome字体图标自定义loading效果 Font Awesome字体图标地址:http://www.fontawesome.com.cn/faicons/ 使用javascrip ...
- 在阿里云的CentOS 6.5 上面安装 timidity++ 和 ffmpeg(含libmp3lame) 实现命令行将midi转换为mp3
首先使用yum安装需要的组件 yum install -y automake autoconf libtool gcc gcc-c++ yasm yasm-devel 然后从sourceforge下载 ...
- 二·、spring成长之路——委派设计模式和单例设计模式
3.委派设计模式 设计思想:就是多个类去完成一项的工作,其中一个类去分发任务,其他类做具体的任务,而具体表现是这个委派类的工作,具体过程是被委派类来操作的 [ITask.java]定义工作的统一标准 ...
- node创建服务器
//引入核心模块 const http = require('http'); //创建服务器 http.createServer((req,res)=>{ }).listen(3000); // ...
- 大数据:Map终结和Spill文件合并
当Mapper没有数据输入,mapper.run中的while循环会调用context.nextKeyValue就返回false,于是便返回到runNewMapper中,在这里程序会关闭输入通道和输出 ...
- Python学习 :异常处理
异常处理 什么是异常处理 - python解释器检测到错误,触发异常(也允许程序员自己触发了异常) - 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,只与异常处理有关) - 如果 ...
- C++中的函数
1.函数的定义和调用 函数的定义形式 返回类型 函数名(形式参数) { 语句序列: } 函数的调用 调用:声明函数原型,函数调用 声明函数原型:类型说明符 被调函数名(含类型说明的形参表) 函数调用: ...
- C语言用一级指针处理字符串的反思
1.一级指针处理字符串的常见方式 如果使用单个指针,不方便对字符串本身进行操作,只适合遍历. 使用两个指针, 两个指针和字符串大致有两个常见处理方式: (1)两个指针从字符串首部开始向后移动,同时处理 ...
- STL的六大容器之iterator----自定义范式
STL的iterator组件,分离了容器和算法. 一.规定 在STL体系下定义iterator,要满足规定的一些规范: 1.iterator_category 有5中分类,决定胃具体的操作,如:++, ...
- 002---Redis
主从复制 主节点负责写数据.从节点负责读数据.主节点定期将数据同步到从节点,从而保证数据的一致性. 一主一从 一主多从 针对"读"较多的场景,"读"由多个从节点 ...