求助666
查看原帖
求助666
60554
Yuanchenpu楼主2020/8/20 11:28

status
code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;

const int MAXN = 5e5 + 10;

int s[MAXN][2];
char a[MAXN], p;
int f[MAXN][4], g[MAXN][4];

void build() {
	int i = p;
	if (a[i] == '1') {
		s[i][0] = p + 1;
		p++; build();
	}
	if (a[i] == '2') {
		s[i][0] = p + 1;
		p++; build();
		s[i][1] = p + 1;
		p++; build();
	}
}

void dp(int u) {
	if (!s[u][0]) {
		f[u][0] = g[u][0] = 1;
		f[u][2] = g[u][2] = f[u][1] = g[u][1] = 0;
		return;
	}
	dp(s[u][0]);
	if (s[u][1]) {
		dp(s[u][1]);
	}
	f[u][0] = max(f[s[u][0]][2] + f[s[u][1]][1], f[s[u][0]][1] + f[s[u][1]][2]) + 1;
	f[u][2] = max(f[s[u][0]][1] + f[s[u][1]][0], f[s[u][0]][0] + f[s[u][1]][1]);
	f[u][1] = max(f[s[u][0]][2] + f[s[u][1]][0], f[s[u][0]][0] + f[s[u][1]][2]);
	g[u][0] = min(g[s[u][0]][2] + g[s[u][1]][1], g[s[u][0]][1] + g[s[u][1]][2]) + 1;
	g[u][2] = min(g[s[u][0]][1] + g[s[u][1]][0], g[s[u][0]][0] + g[s[u][1]][1]);
	g[u][1] = min(g[s[u][0]][2] + g[s[u][1]][0], g[s[u][0]][0] + g[s[u][1]][2]);
}

signed main() {
	scanf("%s", a + 1);
	p = 1;
	build();
	dp(1);
	int ans = max(max(f[1][1], f[1][2]), f[1][0]);
	printf("%lld ", ans);
	ans = min(min(g[1][1], g[1][2]), g[1][0]);
	printf("%lld\n", ans);
	return 0;
}
2020/8/20 11:28
加载中...