题意:

一个由大写字母组成的长度为\(n(n \leq 75)\)的字符串,每次操作可以交换相邻位置的两个字母,求最少操作多少次使字符串中不出现子串VK

分析:

VK之外的字母具体是什么,我们并不关心,所以可以统一设它们为X

设\(d(v,k,x,t)\)表示,已经确定前\(v\)个V,前\(k\)个K和前\(x\)个X为字符串的前\(v+k+x\)个字母,\(t\)取\(0\)或\(1\)表示第\(v+k+x\)个字母是否为V,最少需要操作多少次

在转移的时候可以选择后面的第\(v+1\)个V或第\(k+1\)个K或第\(x+1\)个X接在后面

注意如果此时\(t=1\),也就是最后一个字母为V,那么就不能选择K

因为操作都是两两相邻交换,所以未确定位置的字母相对顺序不会变

要将位置为\(pos\)确定为第\(v+k+x+1\)个字母时,费用为位置在\(pos\)之前且未确定的字母的个数,这些可以\(O(n)\)统计或预处理前缀和\(O(1)\)计算

所以最终时间复杂度为\(O(n^4)\)或\(O(n^3)\)

#include <cstdio>
#include <cstring> const int maxn = 76;
const int INF = 0x3f3f3f3f; int n;
char s[maxn];
int d[maxn][maxn][maxn][2];
int pos[3][maxn], cnt[3], used[3]; // V, K, X void upd(int& a, int b) { if(b < a) a = b; } int cost(int limit) {
int ans = 0;
for(int i = 0; i < 3; i++) {
for(int j = used[i] + 1; j <= cnt[i] && pos[i][j] < limit; j++)
ans++;
}
return ans;
} int main()
{
scanf("%d\n%s", &n, s); for(int i = 0; i < n; i++) {
if(s[i] == 'V') pos[0][++cnt[0]] = i;
else if(s[i] == 'K') pos[1][++cnt[1]] = i;
else pos[2][++cnt[2]] = i;
} memset(d, 0x3f, sizeof(d));
d[0][0][0][0] = 0;
int tot = 0;
int &v = used[0], &k = used[1], &x = used[2];
for(v = 0; v <= cnt[0]; v++) {
for(k = 0; k <= cnt[1]; k++) {
for(x = 0; x <= cnt[2]; x++) {
for(int t = 0; t <= 1; t++) {
int& cur = d[v][k][x][t];
if(cur == INF) continue;
if(v < cnt[0]) upd(d[v+1][k][x][1], cur+cost(pos[0][v+1]));
if(k < cnt[1] && t == 0) upd(d[v][k+1][x][0], cur+cost(pos[1][k+1]));
if(x < cnt[2]) upd(d[v][k][x+1][0], cur+cost(pos[2][x+1]));
}
}
}
} int ans = INF;
for(int t = 0; t < 2; t++) upd(ans, d[cnt[0]][cnt[1]][cnt[2]][t]);
printf("%d\n", ans); return 0;
}

Codeforces 771E Bear and Rectangle Strips DP的更多相关文章

  1. [Codeforces771E]Bear and Rectangle Strips

    Problem 给你一个2*n的矩阵,要求你用补充叠的矩阵去框,要求每个矩阵框中的数之和为0,问最多可以用几个矩阵. Solution 首先预处理出一个点到离它最近的一段和为0的区间的左端点 然后到这 ...

  2. Codeforces.643E.Bear and Destroying Subtrees(DP 期望)

    题目链接 \(Description\) 有一棵树.Limak可以攻击树上的某棵子树,然后这棵子树上的每条边有\(\frac{1}{2}\)的概率消失.定义 若攻击以\(x\)为根的子树,高度\(ht ...

  3. Codeforces 385C Bear and Prime Numbers

    题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...

  4. Codeforces 385B Bear and Strings

    题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...

  5. Codeforces 680D Bear and Tower of Cubes 贪心 DFS

    链接 Codeforces 680D Bear and Tower of Cubes 题意 求一个不超过 \(m\) 的最大体积 \(X\), 每次选一个最大的 \(x\) 使得 \(x^3\) 不超 ...

  6. Codeforces 385C Bear and Prime Numbers(素数预处理)

    Codeforces 385C Bear and Prime Numbers 其实不是多值得记录的一道题,通过快速打素数表,再做前缀和的预处理,使查询的复杂度变为O(1). 但是,我在统计数组中元素出 ...

  7. [Codeforces 639F] Bear and Chemistry (Tarjan+虚树)(有详细注释)

    [Codeforces 639F] Bear and Chemistry(Tarjan+虚树) 题面 给出一个n个点,m条边的无向图(不保证连通,可能有自环和重边),有q次询问,每次询问给出p个点和q ...

  8. [Codeforces 865C]Gotta Go Fast(期望dp+二分答案)

    [Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...

  9. [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】

    [CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...

随机推荐

  1. Google面试准备

    本人小弱,面试过了Google的HC,虽然team match还没完成,到最后还有变数.但对自己这段时间的努力,也算一个交代了. 最初是一年半前Google的HR联系到我,然后第一次在电面就挂了.经过 ...

  2. 检测浏览器中是否有Flash插件

    由于IE和非IE浏览器检测方式不同,所以代码如下 function hasPlugin(name){ debugger; name = name.toLowerCase(); for(var i=0; ...

  3. httpclient 中post请求重定向

    背景:使用httpclient 的post请求进行登录,需要重定向登录,请求重定向后的地址 在httpclient中post请求不像get请求自己可以重定向,实现方式是 判断post请求返回码是否是3 ...

  4. 【LOJ6045】「雅礼集训 2017 Day8」价(网络流)

    点此看题面 大致题意: 有\(n\)种药,每种药有一个权值,且使用了若干种药材.让你选择若干种药,使得药的数量与所使用的药材并集大小相等,求最小权值总和. 网络流 \(hl666\):这种数据范围,一 ...

  5. Ipad连接电脑超时问题

    同时按 HOME+POWER 硬件重启 就会在ipad上弹出信任or不信任选项了 选择信任即可

  6. django中的auth模块以及分页器

    1.auth模块 auth模块是Django提供的标准权限管理系统,可以提供用户身份认证,和权限管理 auth可以和admin模块配合使用, 快速建立网站的管理系统 在INSTALLED_APPS中添 ...

  7. 1、webpack安装

    1.局部安装: npm i -D (npm install --save-dev的简写) 安装指定版本:npm i -D webpack @version 安装最新版:npm i -D webpack ...

  8. Linux tmpwatch命令

    Linux tmpwatch命令 作为系统管理员,很多时候需要定期清理一定规则的文件,比如过期的日志,过期的归档,已备份的文件等等. 如果使用一定的匹配规则,找出这些文件,然后再传递给rm命令,其实是 ...

  9. lambda表达式的使用

    lambda表达式和可遍历的datatable结合使用,把表中某一列中的数据转成字符串,用“|”隔开,代码如下: obj = tableName.AsEnumerable();if(tableName ...

  10. P2661 信息传递 DFS

    题目链接:洛谷 P2661 信息传递 一个人要想知道自己的生日,就意味着信息的传递是成环的,因为每轮信息只能传递一个人,传递的轮数就等于环的大小 环的大小就等于环中的两个点到第三个点的距离之和加一,我 ...