题目链接:

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的更多相关文章

  1. Codeforces Round #131 (Div. 2) B. Hometask dp

    题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...

  2. codeforces 682D(DP)

    题目链接:http://codeforces.com/contest/682/problem/D 思路:dp[i][j][l][0]表示a串前i和b串前j利用a[i] == b[j]所得到的最长子序列 ...

  3. codeforces 666A (DP)

    题目链接:http://codeforces.com/problemset/problem/666/A 思路:dp[i][0]表示第a[i-1]~a[i]组成的字符串是否可行,dp[i][1]表示第a ...

  4. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  5. Codeforces 55D (数位DP+离散化+数论)

    题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. ...

  6. Codeforces 264B 数论+DP

    题目链接:http://codeforces.com/problemset/problem/264/B 代码: #include<cstdio> #include<iostream& ...

  7. CodeForces 398B 概率DP 记忆化搜索

    题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...

  8. CodeForces 512B(区间dp)

    D - Fox And Jumping Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64 ...

  9. CodeForces - 1051D Bicolorings(DP)

    题目链接:http://codeforces.com/problemset/problem/1051/D 看了大佬的题解后觉着是简单的dp,咋自己做就做不来呢. 大佬的题解:https://www.c ...

随机推荐

  1. OpenWrt-Git依赖报错

    前言 在Ubuntu中搭建openwrt编译环境时,安装完了需要的软件之后,我们执行命令检查依赖是否满足, make defconfig 有时会出现以下警告: ihid@ubuntu:~/chaos_ ...

  2. python最新笔试题

    这是笔者面试小十家公司后呕心沥血总结的一些笔试编程题~具体公司就不透露了.哎,说多了都是泪啊. 1.二分法查找: l = [1, 2, 3, 4, 5, 6, 7, 8, 9] find_num = ...

  3. 30. Insert Interval【LintCode by java】

    Description Given a non-overlapping interval list which is sorted by start point. Insert a new inter ...

  4. ASP.NET <% %>的各种形式用法

    1.<% %>用来绑定后台代码 < % ;i<;i++) { Reaponse.Write(i.ToString()); } %> 2.<%# %> 是在绑定 ...

  5. 20155209 实验三 敏捷开发与XP实践

    20155209 实验三 敏捷开发与XP实践 实验内容 1. XP基础 2. XP核心实践 3. 相关工具 提交点一: 在IDEA中使用工具(Code->Reformate Code)把下面代码 ...

  6. MYSQL--慢查询,卡死等处理

    命令: show processlist; 如果是root帐号,你能看到所有用户的当前连接.如果是其它普通帐号,只能看到自己占用的连接. show processlist;只列出前100条,如果想全列 ...

  7. charles录制https请求

    之前一直用windows系统,抓包什么的都是用的fiddler或者wireshark,操作比较简单,扩展性也比较强,现在因为工作原因换了mac,在网上一直没有找到fiddler的mac版本,就只能切换 ...

  8. 一起来做Chrome Extension《一些问题》

    目录 Unchecked runtime.lastError: The message port closed before a response wa received. 使用 eval Conte ...

  9. C# List<string> 的Contains方法 是区分大小写的

    List<string> 的Contains  是区分大小写的 代码: List<string> test = new List<string>(); test.A ...

  10. Windows网络通信(二):socket异步编程

    简述 这里使用的API和同步编程的API是差不多的,只多了一个ioctlsocket和select函数.这里面涉及一个很重要的结构体fd_set.这里用到的API大部分都是windows和linux通 ...