字符串(string.cpp)
字符串(string.cpp)
神TM字符串DP
题目描述:
小林和亮亮正在做一个游戏。小林随意的写出一个字符串,字符串仅由大写字母组成,然后指定一个非负整数m,亮亮可以进行至多m次操作。每次操作为交换相邻的两个字符。亮亮的目标是使得操作后的字符串出现最长相同的字符的长度最大。你的任务是计算这个最大长度是多少。
样例输入:
ABCCDCDDC
4
样例输出:
4
思路:
设置一个字符串长度x26大小的二维数组,对于字符串中的每个字母,记录其出现的位置,将对应的矩阵元素设置为1,其余元素为0,然后按列优先遍历矩阵,将每个字母出现的位置下标记录到一个数组里,计算将i和j之间的相同元素全部移动到一起需要的最小移动次数,在这个最小次数满足满足约束条件的前提下,筛选出最大的连续字母的个数。最后比较所有字母的最大连续个数,输出其中的最大值即可。
CODE:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define N 26
#define M 5050
using namespace std;
string s;
int a[M][N],m;//a是矩阵,出现字母的地方都置1
int f[M],num[M]; //f[i]是存放各字母在满足约束的情况下最大的连续数
int dp(int i , int j , int*a) {
if(i == j) return 0;
else if(i + 1 == j) return a[j] - a[i] - 1;
//当一个字母出现多次且不连续时,应该从两侧往中间移,这样才能保证移动次数最少
else return dp(i + 1 , j - 1 , a) + a[j] - a[i] - (j - i);
}
inline void init() {
memset(a,0,sizeof(a) );
memset(f,0,sizeof(f) );
memset(num,0,sizeof(num) );
}
inline void open_judge() {
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
}
int main() {
//open_judge();
cin>>s;
scanf("%d",&m);
init();
int len = s.length();
for(int i = 0 ; i < len ; i++) {
for(int j = 0 ; j < 26 ; j++) {
a[i][s[j] - 'A'] = 1;
}
}
for(int j = 0 ; j < 26 ; j++) {
int k = 0;
for(int i = 0 ; i < len;i++) {
if(a[i][j] == 1) num[k++] = i;
}
if(k == 1) f[j] = 1;
else {
int temp = -1;
for(int i = 0 ; i < k ; i++) {
for(int l = i + 1 ; l < k ; l++) {
if( dp(i , l , num) <= m ) {
if((l - i) + 1 > temp)
temp = (l - i) + 1;
}
}
}
f[j] = temp;
}
}
sort(f , f + N);
printf("%d\n",f[N-1]);
return 0;
}
字符串(string.cpp)的更多相关文章
- 【stanford C++】字符串(String)与流(Stream)
字符串(String)与流(Stream) 一.C++中字符串(String) 字符串(String):就是(可能是空的)字符序列. C++中的字符串在概念上和Java中的字符串类似. C++字符串用 ...
- C++中字符数组和字符串string
字符数组 C++中字符数组用char str[]能够用来表示一个字符串. (1) 数组的大小和字符串的长度. 数组的大小一定要大于字符串的长度,由于系统会自己主动补上一个'\0'作为字符串的结束标 ...
- javascript类型系统——字符串String类型
× 目录 [1]定义 [2]引号 [3]反斜线[4]特点[5]转字符串 前面的话 javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串S ...
- C# 字符串string类型转换成DateTime类型 或者 string转换成DateTime?(字符串转换成可空日期类型)
在c#中,string类型转换成DateTime类型是经常用到的,作为基本的知识,这里在此做个小结.一般来说可以使用多种方法进行转换,最常用的就是使用Convert.ToDateTime(string ...
- Java常量字符串String理解
Java常量字符串String理解 以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用 "eq ...
- 字符串string类型转换成DateTime或DateTime?类型
常用的Convert.ToDateTime方法 //将含有正确日期格式的string类型转换成DateTime类型 string strDate = "2014-08-01"; D ...
- Javascript基础系列之(三)数据类型 (字符串 String)
javascript一共有9种数据类型 字符串 String 数值型 Number 布尔型 Boolean 未定义 Undefine 空值 Null 对象 Object 引用Refernce 列表型 ...
- Java基础——数组应用之字符串String类
字符串String的使用 Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicode字符J,a,v,a组成的. Java中没有内置的字符串类型,而是在标准Java类库中提供了一 ...
- java中字符串String 转 int(转)
java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...
随机推荐
- emoji & click copy
emoji & click copy document.execCommand("copy"); https://clipboardjs.com/ https://www. ...
- Java反射的用法
Class类 在Java中,每个class都有一个相应的Class对象.也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息. 反射 ...
- mybatis之注解方式实现
* 使用mybatis举例,使用注解方式实现* 不需要针对UserMapperI接口去编写具体的实现类代码,这个具体的实现类由MyBatis帮我们动态构建出来,我们只需要直接拿来使用即可.* 1.导入 ...
- 如何取消mysql的密码?
有两种方法: 1.mysql命令 SET PASSWORD FOR root@localhost=PASSWORD(''); 2.运行 mysqladmin 命令 mysqladmin -u roo ...
- Java多线程与线程同步
六.多线程,线程,同步 ①概念: 并行:指两个或多个在时间同一时刻发生(同时发生) 并发:指两个或多个事件在同一时间段内发生 具体概念: 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多 ...
- Military Problem CodeForces - 1006E(dfs搜一下 标记一下)
题意: 就是有一颗树 然后每次询问 父结点 的 第k个结点是不是他的子嗣...是的话就输出这个子嗣..不是 就输出-1 解析: 突然想到后缀数组的sa 和 x的用法..就是我们可以用一个id标记当前 ...
- NOI.AC 20181103 题解
CF 1037B Reach Median 班上 n个同学(n 是奇数)排成一排站队,为了美观,需要大家高度的中位数是 x. 你可以让同学们在脚下垫木板或者稍微蹲一点来达成这个目标.对任意一位同学的 ...
- LeetCode 5回文数
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...
- mysql concat_ws 与 concat 多字段模糊匹配应用
有时我们希望在表中多个字段检索是否有我们给出的关键字,我们可以使用 concat_ws 和 concat 连接需要检索的字段,如: select * from userInfo where conca ...
- MFC Activex 开发、ocx打包成cab、部署、测试、自动升级
小小抱怨下:也许是MFC现在用的人少的缘故.在国内和国外都基本上找不到什么全的资料.特别是ocx打包成Cab时的安装文件inf的编写方面,国内基本上是copy,抄的还一知半解.查找个资源真心的累啊.现 ...