Codeforces 846 A Curriculum Vitae(dp)

来源:互联网 发布:tcp编程用什么语言 编辑:程序博客网 时间:2024/05/18 03:24

题目地址
题意:给你一个01串,让你删除最少的字符,使得这个字符串变成先0后1的字符串,求最后字符串的长度
思路:一个典型的dp问题。有两种情况,这个理清楚就好了:

  • 1、当当前字符为0时,有两种选择,一种是继承前面全是0的,这个时候就需要加一,第二种是删除这个字符,这个时候就是取前面全为0的情况和已经改为1的情况的最大值。
  • 2当当前字符为1时,有两种选择,一种是继承前面全为0的情况和已经改为1的情况的最大值,这个时候就需要加一,第二种是删除这个字符,这个时候就是取前面全为0的情况。

代码比较清晰,可以参照代码来理解。
PS:开始01看错了,以为是先1后0,WA了一次。

 #include <iostream>#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#include <iomanip>#define N 110#define M 4000010#define LL __int64#define inf 0x7f7f7f7f#define lson l,mid,ans<<1#define rson mid+1,r,ans<<1|1#define getMid (l+r)>>1#define movel ans<<1#define mover ans<<1|1using namespace std;const double PI = acos(-1.0);int num[N], dp[N][2];int main() {    cin.sync_with_stdio(false);    int n;    while (cin >> n) {        for (int i = 1; i <= n; i++) {            cin >> num[i];        }        dp[0][0] = dp[0][1] = 0;        for (int i = 1; i <= n; i++) {            if (num[i] == 0) {                dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);                dp[i][1] = dp[i - 1][1] + 1;            }            else{                dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]) + 1;                dp[i][1] = dp[i - 1][1];            }        }        cout << max(dp[n][0], dp[n][1]) << endl;    }    return 0;}
原创粉丝点击