题解 | #游游的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-07 19:10
已编辑
中国科学技术大学 C++
silly01:现在先去 momenta,8-9月去鹅找日常实习,八股文算法背好了你这随便进。不过建议补充一下后端知识,MySQL、Redis看下八股,再补个6824,加点go后台的技术栈,9月随便进大厂。CPP后端只能来WXG
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务