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 ...
随机推荐
- goland实现函数式链式编程
先来看一段代码 package main import ( "fmt" elastic "gopkg.in/olivere/elastic.v2" ) type ...
- 嵌入式C语言自我修养 09:链接过程中的强符号和弱符号
9.1 属性声明:weak GNU C 通过 __atttribute__ 声明weak属性,可以将一个强符号转换为弱符号. 使用方法如下. void __attribute__((weak)) fu ...
- python列表的通用操作
#'+'和'*'#+可以将两个列表拼接为一个列表my_list = [1,2,3]+[4,5,6]#*可以将列表重复指定的次数my_list = [1,2,3]*5 print(my_list) #创 ...
- hive的分桶
套话之分桶的定义: 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储.对于 hive 中每一个表.分区都可以进一步进行分桶. 列的哈希值除以桶的个数来决定每条数据划分在哪个桶中.(网上其它定 ...
- 蓝牙耳机电路和PCB(网上下载用于练习)
这个是文件 https://pan.baidu.com/s/1smIyd_aNIt-ON8z8AeWn4Q 密码 w6ju 这是导入进去以后的样子,前面步骤我就跳过了 这是原作者的布局 但是我在看原理 ...
- Python学习之——Oracle数据库连接
一.安装Oracle客户端 1.下载对应安装文件,官网地址:http://www.oracle.com/technetwork/database/database-technologies/insta ...
- 20155206 2016-2017-2 《Java程序设计》第十周学习总结
20155206 2016-2017-2 <Java程序设计>第十周学习总结. 教材学习内容总结 教材学习内容总结 Java的网络编程 •网络编程是指编写运行在多个设备(计算机)的程序,这 ...
- 20155218 2006-2007-2 《Java程序设计》第2周学习总结
20155218 2006-2007-2 <Java程序设计>第2周学习总结 教材学习内容总结 java编程风格: java中没有指针的概念,尽管也有数组和对象的引用的概念,但他的管理全部 ...
- 学习Java的必要知识点记录
在java中什么是类和对象 在还没有学习java类和对象的时候,基本上都是解决的一些比较简单的小程序,仅仅也就是几十行代码而已,如果要开发的是一个很大的程序,需要用到几万行甚至是几十万行代码的量,如果 ...
- 20155302 2016-2017-2 《Java程序设计》 第1周学习总结
20155302 2016-2017-2 <Java程序设计> 第1周学习总结 教材学习内容总结 浏览全书提出问题 chapter1:怎么保证现在系统在用最高版本的JRE呢?在哪里查看及升 ...