codeforces 180C 线性DP

codeforces 180C


题意:

给 定 一 串 字 符 , 只 含 小 写 和 大 写 字 母 , 你 可 以 将 任 意 字 符 随 意 转 换 大 小 写 。 给定一串字符,只含小写和大写字母,你可以将任意字符随意转换大小写。
问 最 少 操 作 数 , 使 字 符 串 左 边 全 是 大 写 字 母 , 右 边 全 是 小 写 字 母 。 问最少操作数,使字符串左边全是大写字母,右边全是小写字母。 使


题解:

d p [ i ] [ j ] 表 示 在 区 间 [ 1 , i ] 上 , 当 前 字 母 变 成 小 写 ( j = 0 ) 或 大 写 ( j = 1 ) 时 的 最 少 操 作 数 。 dp[i][j]表示在区间[1,i]上,当前字母变成小写(j=0)或大写(j=1)时的最少操作数。 dp[i][j][1,i]j=0j=1

  • 若 当 前 字 母 是 小 写 , d p [ i ] [ 0 ] = m i n ( d p [ i − 1 ] [ 0 ] , d p [ i − 1 ] [ 1 ] ) , d p [ i ] [ 1 ] = d p [ i − 1 ] [ 1 ] + 1 若当前字母是小写,dp[i][0] = min(dp[i-1][0], dp[i-1][1]),dp[i][1] = dp[i-1][1]+1 dp[i][0]=min(dp[i1][0],dp[i1][1])dp[i][1]=dp[i1][1]+1
  • 若 当 前 字 母 是 大 写 , d p [ i ] [ 0 ] = m i n ( d p [ i − 1 ] [ 0 ] , d p [ i − 1 ] [ 1 ] ) + 1 , d p [ i ] [ 1 ] = d p [ i − 1 ] [ 1 ] 若当前字母是大写,dp[i][0] = min(dp[i-1][0], dp[i-1][1])+1,dp[i][1] = dp[i-1][1] dp[i][0]=min(dp[i1][0],dp[i1][1])+1dp[i][1]=dp[i1][1]

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

int main() {
    string s;
    cin >> s;
    int n = s.size();
    for(int i = 0 ; i < n ; i++){
        dp[i][0] = islower(s[i]) ? min(dp[i-1][0], dp[i-1][1]) : min(dp[i-1][0], dp[i-1][1])+1;
        dp[i][1] = islower(s[i]) ? dp[i-1][1]+1 : dp[i-1][1];
    }
    cout << min(dp[n-1][0], dp[n-1][1]) << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值