zoukankan      html  css  js  c++  java
  • 字符串(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
    ",f[N-1]);
        return 0;
    }
    
    
  • 相关阅读:
    使用注解@Slf4j简化Logger的初始化
    Windows系统CPU和内存状态实时查询(Java)
    Windows下压缩包安装Mysql
    ubuntu安装IntelliJ Idea及图标创建
    【CSS】使用边框和背景
    【CSS】使用CSS选择器(第二部分)
    【CSS】使用CSS选择器
    【CSS】理解CSS
    【HTML5】使用多媒体
    【HTML5】嵌入另一张HTML文档、通过插件嵌入内容、嵌入数字表现形式
  • 原文地址:https://www.cnblogs.com/Repulser/p/9797860.html
Copyright © 2011-2022 走看看