牛客练习赛67 D牛妹爱数列 题解(dp)

题目链接

题目大意

给你一个长为n的01串,要你进行最少的操作使得这01串变成全为0,求最少操作次数

有两种不同类型的操作

1:翻转一个前缀

2:单调翻转一个元素

题目思路

居然是一个dp,标程讲的很好,直接截图

代码

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=1e5+5,inf=0x3f3f3f3f,mod=998244353;
const double eps=1e-10;
int n,a[maxn],dp[maxn][2];
signed main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;i++){
        if(a[i]){
            dp[i][1]=min(dp[i-1][0]+1,dp[i-1][1]);
            dp[i][0]=min(dp[i-1][1]+1,dp[i-1][0]+1);
        }else{
            dp[i][1]=min(dp[i-1][0]+1,dp[i-1][1]+1);
            dp[i][0]=min(dp[i-1][1]+1,dp[i-1][0]);
        }
    }
    printf("%d\n",dp[n][0]);
    return 0;
}

posted @ 2020-09-26 20:33  hunxuewangzi  阅读(118)  评论(0编辑  收藏  举报