牛客练习赛67 D. 牛妹爱数列

牛妹爱数列

https://ac.nowcoder.com/acm/contest/6885/D

Description

他手里有一个长度为n的序列a,保证它是一个01序列,并执行以下两种操作:
1.单点修改:将位置x上的数翻转(0变1,1变0);
2.前缀修改:将位置1~x上的数翻转(每个数都0变1,1变0)。
他现在想要最小化翻转次数,使得数列上的所有数都变为0。

Solution

贪心贪不动,考虑dp,主要在于如何表示状态,设:

表示到了第i个位置,把前面的都变成0的最小操作数

表示到了第i个位置,把前面的都变成1的最小操作数

那么很容易就能表示出状态转移方程,最后输出 即可。

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int a[N], dp[N][2];
int main() {
    int n; cin >> n;
    memset(dp, 13, sizeof(dp));
    for(int i = 1; i <= n; i++) cin >> a[i];
    if(a[1]) dp[1][1] = 0, dp[1][0] = 1;
    else dp[1][1] = 1, dp[1][0] = 0;
    for(int i = 2; i <= n; i++) {
        if(a[i]) {
            dp[i][0] = min(dp[i - 1][1] + 1, dp[i - 1][0] + 1);
            dp[i][1] = min(dp[i - 1][1], dp[i - 1][0] + 1);
        } else {
            dp[i][0] = min(dp[i - 1][0], dp[i - 1][1] + 1);
            dp[i][1] = min(dp[i - 1][0] + 1, dp[i - 1][1] + 1);
        }
    }
    cout << min(dp[n][0], dp[n][1] + 1) << "\n";
  return 0;
}
全部评论
贪心不香吗?
点赞 回复 分享
发布于 2020-08-15 12:56

相关推荐

点赞 评论 收藏
分享
10-10 01:10
已编辑
深圳大学 测试开发
面了100年面试不知...:六月到九月,四个项目一个实习,是魔丸吗
投了多少份简历才上岸
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

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