codeforces 877B 线性DP

codeforces 877B


题意:

给 定 一 串 字 符 串 , 只 含 ‘ a ’ 和 ‘ b ’ , 你 需 要 在 不 改 变 字 符 顺 序 的 前 提 下 将 字 符 串 分 为 三 段 , 给定一串字符串,只含‘a’和‘b’,你需要在不改变字符顺序的前提下将字符串分为三段, ab
第 一 、 三 段 只 含 ′ a , 第 二 段 只 含 ′ b ′ , 必 要 时 你 可 以 删 除 一 些 字 符 。 第一、三段只含'a,第二段只含'b',必要时你可以删除一些字符。 ab
问 满 足 条 件 的 最 大 字 符 串 长 度 。 问满足条件的最大字符串长度。


题解:

d p [ i ] [ j ] 表 示 区 间 [ 1 , i ] 上 , 可 以 得 到 形 如 a a ( j = 0 ) 或 a b b ( j = 1 ) 或 a b a a ( j = 2 ) 的 最 大 字 符 串 长 度 。 dp[i][j]表示区间[1,i]上,可以得到形如aa(j=0)或abb(j=1)或abaa(j=2)的最大字符串长度。 dp[i][j][1,i]aaj=0abbj=1abaaj=2

  • d p [ i + 1 ] [ 0 ] = d p [ i ] [ 0 ] + ( s [ i ] = = ′ a ′ ) dp[i+1][0] = dp[i][0]+(s[i] == 'a') dp[i+1][0]=dp[i][0]+(s[i]==a)
  • d p [ i + 1 ] [ 1 ] = m a x ( d p [ i ] [ 0 ] , d p [ i ] [ 1 ] ) + ( s [ i ] = = ′ b ′ ) dp[i+1][1] = max(dp[i][0], dp[i][1])+(s[i] == 'b') dp[i+1][1]=max(dp[i][0],dp[i][1])+(s[i]==b)
  • d p [ i + 1 ] [ 2 ] = m a x ( d p [ i ] [ 1 ] , d p [ i ] [ 2 ] ) + ( s [ i ] = = ′ a ′ ) dp[i+1][2] = max(dp[i][1], dp[i][2])+(s[i] == 'a') dp[i+1][2]=max(dp[i][1],dp[i][2])+(s[i]==a)

#include <bits\stdc++.h>
using namespace std;
const int N = 5001;
int dp[N][3];

int main() {
    string s;
    cin >> s;
    int n = s.size();
    for(int i = 0 ; i < n; i++)
    {
        dp[i+1][0] = dp[i][0]+(s[i] == 'a');
        dp[i+1][1] = max(dp[i][0], dp[i][1])+(s[i] == 'b');
        dp[i+1][2] = max(dp[i][1], dp[i][2])+(s[i] == 'a');
    }
    cout << max(dp[n][0], max(dp[n][1], dp[n][2])) << endl; 
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值