字符串abcdef, 有条件的最长子序列

字符串abcdef, 有条件的最长子序列题目描述 字符串 T 包含 abcdef Ta 只能在 ce 前面 c 只能在 e 前面 b 只能在 df 前面 d 只能在 f 前面问最长子序列多长 example afcaba 4 bbeeae 5 题解分成两个字符串算总长 一个只包含 ace 一个只包含 bdf

题目描述:

字符串T包含abcdef, T <
a只能在ce前面,c只能在e前面
b只能在df前面,d只能在f前面
问 最长子序列多长?
example:
afcaba = 4;
bbeeae = 5;

题解

分成两个字符串算总长,一个只包含ace,一个只包含bdf。以a结尾的只能从a转移过来,c可以从ac转移过来,e可以从ace转移过来。复杂度O(n)。

// // Created by ironzhou on 2020/8/3. // 字符串T包含abcdef, T <  // a只能在ce前面,c只能在e前面 // b只能在df前面,d只能在f前面 // 问 最长子序列多长? // example: afcaba = 4; bbeeae = 5 // #include <bits/stdc++.h> #define Size  using namespace std; int main(){ 
    string s; cin>>s; int dp1[Size][3],dp2[Size][3]; for(int i = 0 ; i < 3 ; i++) { 
    dp1[0][i] = 0; dp2[0][i] = 0; } int sum = 0; for(int i = 1 ; i <= s.size() ; i++) { 
    int k = i-1; for(int j = 0 ; j < 3; j++) { 
    dp1[i][j] = dp1[i-1][j]; dp2[i][j] = dp2[i-1][j]; } switch (s[k]) { 
    case 'a': dp1[i][0] = dp1[i-1][0] + 1; break; case 'b': dp2[i][0] = dp2[i-1][0] + 1; break; case 'c': dp1[i][1] = max(dp1[i-1][0]+1,dp1[i-1][1]+1); break; case 'd': dp2[i][1] = max(dp2[i-1][0]+1,dp2[i-1][1]+1); break; case 'e': dp1[i][2] = max(dp1[i-1][0]+1,dp1[i-1][1]+1); dp1[i][2] = max(dp1[i][2],dp1[i-1][2]+1); break; case 'f': dp2[i][2] = max(dp2[i-1][0]+1,dp2[i-1][1]+1); dp2[i][2] = max(dp2[i][2],dp2[i-1][2]+1); break; } for(int j = 0 ; j < 3; j++) { 
    for(int k = 0; k < 3 ; k++) { 
    sum = max(sum, dp1[i][j] + dp2[i][k]); } } } cout<<sum<<endl; return 0; } 
今天的文章 字符串abcdef, 有条件的最长子序列分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2025-01-04 12:06
下一篇 2025-01-04 12:01

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/101676.html