3789. 隐藏字符串(dp)

Posted CCSU_Cola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3789. 隐藏字符串(dp)相关的知识,希望对你有一定的参考价值。

题目链接

题意:

给定一个由小写字母构成的字符串 s。

我们称字符串 t 隐藏于字符串 s 中,如果它满足:

  • 存在一个字符串 ss 的子序列,与其一一对应。
  • 该子序列的各个元素的下标可以构成一个等差序列。

例如,字符串 aab 就隐藏于字符串 aaabb 中,因为 aaabb 的第 1,3,5 个元素刚好可以构成 aab,而这恰好是一个公差为 2 的等差数列。

字符串 tt 可能隐藏于字符串 s 中多次,这取决于共有多少个 s 的不同子序列满足与字符串 t 一一对应,且各个元素下标可以构成一个等差数列。

例如,在字符串 aaabb 中,a 隐藏了 3 次,b 隐藏了 2 次,ab 隐藏了 6 次…

现在,请你求出字符串 ss 中,隐藏次数最多的字符串一共隐藏了多少次?

思路:

某一个大于2的序列出现的次数一定和它前两个字母出现的次数相等,所以我们只需要计算两个字母出现的次数或者单个字母出现的次数即可。即记录f[i][j],第一个字母为i,第二个字母为j出现的次数。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll s[30],f[30][30];
char str[100010];
int main()
    scanf("%s",str);
    ll res=0;
    for(int i=0;str[i];i++)
        int t=str[i]-'a';
        for(int j=0;j<26;j++)
            f[j][t]+=s[j];
            res=max(f[j][t],res);//j-k出现的次数
        
        s[t]++;
        res=max(s[t],res);//单个字母出现的次数
    
    printf("%lld\\n",res);

以上是关于3789. 隐藏字符串(dp)的主要内容,如果未能解决你的问题,请参考以下文章

[思维] aw3789. 隐藏字符串(脑筋急转弯+枚举+递推+aw周赛010_3)

leetcode 1027. 最长等差数列

codevs2205等差数列

ZOJ 3789 并查集

poj 2140 Herd Sums(等差数列)

等差数列划分--子序列问题DP解决