题意:

  给你一个长度为n的字符串s,并且告诉你有m对字母不能相邻,问你最少在s中取出多少个字符能够使这个字符串合法。

题解:

  表示状态:

    dp[i] = max num of letters

    考虑到第i个字符并且留下了该字符,i以及i之前留下的字符形成的字符串合法,留下字符的最多个数。

  找出答案:

    n - (max dp[i]) (0<=i<n)

  如何转移:

    开一个辅助数组pre[c],c为一个小写字母的序号('a'为0),意为当前以c结尾的最长字符串长度。

    pre数组随着i的枚举而被不断更新,所以当前的pre数组中存的都是i以及i之前的答案。

    假设现在考虑到第i个字符,要更新dp[i]的值。

    if(s[i]-'a'和j可以相邻) dp[i] = max(dp[i], pre[j]);

    枚举i,j即可。 (i<=0<n, 0<=j<26)

  边界条件:

    dp[1] = 1,把其他字符都去掉,只留第i个字符,dp最少为1。

    并且刚开始所有的pre[c]为0。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 100005
#define MAX_A 30
#define INF 10000000 using namespace std; int n,m;
int ans=;
int dp[MAX_N];
int pre[MAX_A];
bool near[MAX_A][MAX_A];
string s; void read()
{
memset(near,false,sizeof(near));
cin>>n>>s>>m;
for(int i=;i<m;i++)
{
char a,b;
cin>>a>>b;
near[a-'a'][b-'a']=true;
near[b-'a'][a-'a']=true;
}
} void solve()
{
memset(pre,,sizeof(pre));
for(int i=;i<n;i++)
{
dp[i]=;
for(int j=;j<;j++)
{
if(!near[s[i]-'a'][j])
{
dp[i]=max(dp[i],pre[j]+);
}
}
pre[s[i]-'a']=max(pre[s[i]-'a'],dp[i]);
ans=max(ans,dp[i]);
}
} void print()
{
cout<<n-ans<<endl;
} int main()
{
freopen("note.in","r",stdin);
freopen("note.out","w",stdout);
read();
solve();
print();
}

2017SN多校D1T2 note:dp的更多相关文章

  1. HDU 4632 Palindrome subsequence (2013多校4 1001 DP)

    Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65535 K (Java/ ...

  2. 2015多校.Zero Escape (dp减枝 && 滚动数组)

    Zero Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  3. GDUT 校赛02 dp回文串

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABSkAAAIhCAIAAAAtmainAAAgAElEQVR4nOzdfaxkd33n+ZJacstqa3 ...

  4. GDUT 校赛01 dp

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABT8AAAILCAIAAAChHn9YAAAgAElEQVR4nOy9f4il13nneUGgxrRYux ...

  5. ZOJ3956 ZJU2017校赛(dp)

    题意:给出n对(h,c) 记  sumh为选出的h的总和  sumc为选出的c的总和 你可以从中选出任意多对(可以不选) 使得  sumh^2-sumh*sumc-sumc^2 最大 输出最大值 输入 ...

  6. 2017SN多校D1T1 loveletter:模拟

    题意: 两张n*m的纸.一张透明纸,上面有些地方是黑的,有些地方是透明的.另一张纸上写满了字母. 你需要将透明纸放在写字的纸上,分别顺时针旋转0°.90°.180°.270°,每次从上到下.从左到右写 ...

  7. hdu–2369 Bone Collector II(01背包变形题)

    题意:求解01背包价值的第K优解. 分析: 基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并. 首先看01背包求最优解的状态转移方程:\[dp\left[ j ...

  8. HDU 5074 Hatsune Miku(2014鞍山赛区现场赛E题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5074 解题报告:给出一个长度为n的序列,例如a1,a2,a3,a4......an,然后这个序列的美丽 ...

  9. POJ 3356.AGTC

    问题简述: 输入两个序列x和y,分别执行下列三个步骤,将序列x转化为y (1)插入:(2)删除:(3)替换: 要求输出最小操作数. 原题链接:http://poj.org/problem?id=335 ...

随机推荐

  1. Android世界第一个activity启动过程

    Android世界第一个activity启动过程 第一次使用Markdown,感觉不错. Android系统从按下开机键一直到launcher的出现,是一个如何的过程,中间都做出了什么操作呢.带着这些 ...

  2. vue class绑定方式

    1.对象语法 <div class="static" v-bind:class="{ active: isActive, 'text-danger': hasErr ...

  3. ICON小工具如何使用

    对于ICON这个小资源,我们可以手动绘制.选择bmp图形的大小,尤其是旁边的选择工具(矩形或者弧形),我们可以通过选择工具挪动我们手动绘制的图标,其实图标只有中间那部分有用,其他没有用.还有最右边色拾 ...

  4. Xen on Ubuntu

    实验环境 ubuntu-14.04.1-desktop-amd64.iso Recommended reference: https://help.ubuntu.com/community/Xen h ...

  5. python爬虫,从hao123爬取网址信息

    最近研究python的爬虫,小小程序,拿下来分享,本人使用python3.7,纯粹兴趣爱好,希望能帮助大家激发兴趣.从hao123,爬取各种网址信息,代码如下. import urllib.reque ...

  6. servletResponse 随机生成图片验证码

    /***********************************servlet页面************************************/ package response; ...

  7. 在PHP中,通过filesize函数可以取得文件的大小,文件大小是以字节数表示的。如果要转换文件大小的单位,可以自己定义函数来实现。

    <?php function getsize($size, $format) { $p = 0; if ($format == 'kb') { $p = 1; } elseif ($format ...

  8. 【WPF学习笔记】之如何保存画面上新建的数据到数据库中并且删除画面上的数据和数据库的数据:动画系列之(五)

    ...... 承接系列四后续: 首先,我要在用户控件2中添加“保存”,“删除”按钮. XAML代码: <UserControl x:Class="User.uc_item" ...

  9. Android——4.2 - 3G移植之路之 reference-ril .pppd 拨号上网 (三)

    Android的RIL机制中的 reference-ril.c 即为厂商提供的驱动接口.这个驱动源代码各个厂商都是有提供的,网上也有下载.我如今用的就是huawei wcdma的.最后编译成libre ...

  10. sigar 监控服务器硬件信息

    转载 http://www.cnblogs.com/jifeng/archive/2012/05/16/2503519.html 通过使用第三方开源jar包sigar.jar我们可以获得本地的信息 1 ...