题解 | #游游的01串操作#

游游的01串操作

https://ac.nowcoder.com/acm/problem/257437

题意

这里有一个由0或1构成字符串,我们需要通过变换字符(1或0)使字符串中相邻的两个字符互不相等。又知道更改第位的字符需花费,求使字符串合法的最小花费?

思路

因为我们我那时要求最小花费,但是此处要考虑两个值。

  • 改变字符的操作数量
  • 改变每一个字符的花费不同

这时我们通过最小值又不可以直接贪心便可以想到动态规划,这道题变简单了!

状态:表示到了第个字符,当前字母的状态(1/0)。

转移:若当前这个字符状态为1:

  • 当前位置不变 dp[i][1] = dp[i - 1][0];直接等于上一个字符为0的情况。
  • 把当前位置的字符变成0dp[i][0] = dp[i - 1][1] + i + 1;(枚举字符串的每一位从0开始)等于上一个字符为0的情况再加上所需的花费。

总代码

#include<bits/stdc++.h>
#define int long long//防止爆int, 本题不用。

using namespace std;

const int MAXX = 1e6 + 5;

string s;
int dp[MAXX][2];


signed main(){
    cin >> s;
    for(int i = 0; i <= s.size(); i++){
        dp[i][0] = dp[i][1] = LLONG_MAX;
    }
    if(s[0] == '1'){
        dp[0][1] = 0;
        dp[0][0] = 1;
    }else{
        dp[0][0] = 0;
        dp[0][1] = 1;
    }
    for(int i = 1; i < s.size(); i++){
        if(s[i] == '1'){
            dp[i][0] = dp[i - 1][1] + i + 1;
            dp[i][1] = dp[i - 1][0];
        }else{
            dp[i][1] = dp[i - 1][0] + i + 1;
            dp[i][0] = dp[i - 1][1];
        }
    }
    cout << min(dp[s.size() - 1][0], dp[s.size() - 1][1]);
    
    return 0;
}
全部评论

相关推荐

05-09 14:45
门头沟学院 Java
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务