【题目】C. Bear and Company

【题意】给定大写字母字符串,交换相邻字符代价为1,求最小代价使得字符串不含"VK"子串。n<=75。

【算法】动态规划

【题解】关键在于表示状态,我们将确定下来的前若干个固定作为状态,后面新加的字符不会进入固定的前若干个。(为了方便,非'V''K'的字符皆为‘X')

由于相同字符显然不可能跨越,那么前若干个的有效信息只有:它是由前v个’V',前k个‘K',前x个’X'组成的,最后一个字符是否’V',即f[v][k][x][0/1]。

转移时枚举新加入的字符,问题在于统计新加入字符前有多少未固定字符,就是加入这个字符的代价。

假设0是'V',1是‘K',2是’X',很容易预处理p[i][0]表示第i个'V'的位置,c[i][0]表示前i个位置‘V'的数量(1和2同理),然后就很容易计算了。

如果推不清楚可以参考代码,很好理解。

复杂度O(n^3)。

#include<cstdio>
#include<cstring>
int n,p[][],c[][],f[][][][],V,K,X;
char s[];
int min(int a,int b){return a<b?a:b;}
int r(int o,int v,int k,int x){return o-min(c[o][],v)-min(c[o][],k)-min(c[o][],x);}
int main(){
scanf("%d%s",&n,s+);
for(int i=;i<=n;i++){
for(int j=;j<;j++)c[i][j]=c[i-][j];
if(s[i]=='V')V++,p[V][]=i,c[i][]++;else
if(s[i]=='K')K++,p[K][]=i,c[i][]++;else
X++,p[X][]=i,c[i][]++;
}
memset(f,0x3f,sizeof(f));
f[][][][]=;
for(int i=;i<=V;i++)
for(int j=;j<=K;j++)
for(int k=;k<=X;k++){
int Q=min(f[i][j][k][],f[i][j][k][]);
f[i+][j][k][]=min(f[i+][j][k][],Q+r(p[i+][],i+,j,k));
f[i][j+][k][]=min(f[i][j+][k][],f[i][j][k][]+r(p[j+][],i,j+,k));
f[i][j][k+][]=min(f[i][j][k+][],Q+r(p[k+][],i,j,k+));
}
printf("%d",min(f[V][K][X][],f[V][K][X][]));
return ;
}

【CodeForces】790 C. Bear and Company 动态规划的更多相关文章

  1. Codeforces 835F Roads in the Kingdom - 动态规划

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一颗基环树,要求删去其中一条边,使得剩下的图形是一棵树,并且最长路的长度最短,求最长路的最短长度. 路径可以分为两部分:跨过环 和 在树内 ...

  2. Codeforces 581F Zublicanes and Mumocrates - 树形动态规划

    It's election time in Berland. The favorites are of course parties of zublicanes and mumocrates. The ...

  3. 【Codeforces 949D】Shake It! 【动态规划】

    参考: http://blog.csdn.net/gjghfd/article/details/77824901 所求的是满足条件的图中“不同构”的数量,意味着操作的顺序是可以忽略的.考虑若干次操作后 ...

  4. 【32.89%】【codeforces 574D】Bear and Blocks

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  5. Codeforces Round #335 Sorting Railway Cars 动态规划

    题目链接: http://www.codeforces.com/contest/606/problem/C 一道dp问题,我们可以考虑什么情况下移动,才能移动最少.很明显,除去需要移动的车,剩下的车, ...

  6. codeforces 680C C. Bear and Prime 100(数论)

    题目链接: C. Bear and Prime 100 time limit per test 1 second memory limit per test 256 megabytes input s ...

  7. codeforces 680B B. Bear and Finding Criminals(水题)

    题目链接: B. Bear and Finding Criminals //#include <bits/stdc++.h> #include <vector> #includ ...

  8. codeforces 680A A. Bear and Five Cards(水题)

    题目链接: A. Bear and Five Cards //#include <bits/stdc++.h> #include <vector> #include <i ...

  9. Codeforces 979E Kuro and Topological Parity - 动态规划 - 组合数学

    题目传送门 传送点 题目大意 给定$n$个标号依次为$1, 2, \cdots, n$的点,其中一些点被染成一些颜色,剩下的点没有染色.你需要添加一些有向边并将剩下的点染色,满足有向边从编号小的一端指 ...

随机推荐

  1. 3dContactPointAnnotationTool开发日志(三四)

      今天就是让背景图可以变大变小,变透明度,然后将3d的点投影到图片上,输出2d接触点信息:   可以看到输出了正确的接触点信息:   然后还把空物体的包围盒大小设置为边长为0.1的的正方体,点击选中 ...

  2. 程序员必看电影:Java 4-ever

    http://blog.csdn.net/zdwzzu2006/article/details/5863068

  3. 虚拟机下安装CentOS6.5系统教程

    虚拟机下安装CentOS6.5系统教程 时间:2014-12-09 01:40来源:linuxdown.net 作者:linuxdown.net 举报 点击:15315次 其实通过VM安装虚拟机还是蛮 ...

  4. Win2019 + Oracle18c SQLPLUS 命令行出现乱码的解决

    1. Win2019 中文版 安装了 Oracle数据库, dbca 建库时选择的 的字符集是 ZHS16GBK 然后发现使用sqlplus 时有乱码的现象如图示: 2. csdn 上面有一个博客有解 ...

  5. 【.Net】C#获取Windows系统特殊文件夹的路径

    系统特殊文件夹是包含公共信息的文件夹,如“Program Files”.“Programs”.“System”或“Startup”.特殊文件夹在默认情况下由系统设置,或者由用户在安装 Windows ...

  6. equals与==区别

    equals与==区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间 ...

  7. [三]SpringBoot 之 热部署

    如下配置 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring ...

  8. 深入理解JVM一垃圾回收算法

    我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. 一.stop the world 在介绍 ...

  9. BZOJ3524 & LOJ2432:[POI2014]代理商Couriers——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3524 https://loj.ac/problem/2432 给一个长度为n的序列a.1≤a[i] ...

  10. KMP算法复习【+继续学习】

    离NOIP还剩12天,本蒟蒻开始准备复习了. 先来个KMP[似乎我并没有写过KMP的blog] KMP KMP算法是解决字符串匹配问题的一个算法,主要是单对单的字符串匹配加速,时间复杂度O(m + n ...