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 ...
随机推荐
- 偏前端-纯css,手写轮播-(焦点切换 和 自动轮播 只可选择一种,两者不可共存)
现在我们一般都是在网上找个轮播插件,各种功能应有尽有,是吧!!~大家似乎已经生疏了手写是什么感觉.万一哪天想不起来,人家要手写,就尴尬了!~~跟我一起复习一下吧 不多说:效果图看一下: 高度不能是固定 ...
- 一张图一个表——CSS选择器总结
CSS选择器总结: (这些表是一张图片^_^) 看底部 完整思维导图图片和表格的下载地址:https://download.csdn.net/download/denlnyyr/10597820 (我 ...
- vue-cli 脚手架中 webpack 配置基础文件详解
一.前言 vue-cli是构建vue单页应用的脚手架,输入一串指定的命令行从而自动生成vue.js+wepack的项目模板.这其中webpack发挥了很大的作用,它使得我们的代码模块化,引入一些插件帮 ...
- Mac配置MySql
MySql在Mac下的情况如下: 首先,我们进入MySql的官网下载MySql(直接点击即可),打开之后便是这样. 我们点击红色方框标记的内容,之后我等待下载完成. 下载完成之后,我们需要点点,注意一 ...
- 使用mac学习java的一些基本操作
使用mac学习java的一些基本操作 本文主要讲一下MacOS与windows的不同 iTerm2 使用mac的同学是不需要安装虚拟机来学习linux命令的.只需要使用iTerm2[下载地址]+zsh ...
- 学号20155311 2016-2017-2 《Java程序设计》第10周学习总结
学号20155311 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据 计算机网络 路 ...
- 20155336虎光元实验四 Android开发基础
20155336虎光元实验四 Android开发基础 实验内容 1:完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 2:创建 ThirdActivi ...
- EXCEL 处理重复数据名字后面追加值
近期要用 EXCEL 处理重复数据名字后面追加值的,如图: 先排序,再根据条件追加 [公式]=+B6&IF(COUNTIF($B$6:B6,B6)-1>0,"_" & ...
- Java集合——LinkedList源码详解
)LinkedList直接继承于AbstractSequentialList,同时实现了List接口,也实现了Deque接口. AbstractSequentialList为顺序访问的数据存储结构提供 ...
- 【转载】Direct3D基础知识
原文:Direct3D基础知识 重新从头开始学习DX,以前太急于求成了,很多基础知识都没掌握就开始写程序了,结果出了问题很难解决. 1. D3D体系结构 D3D与GDI处与同一层次,区 ...