文章

68

粉丝

691

获赞

26

访问

578.3k

头像
有趣的dp题
P1642 杭州电子科技大学机试题
发布于2020年5月31日 20:57
阅读数 8.8k

代码有点丑见谅,拿到题可以想到,如果反转,那么我们必须翻转一个0的数目多余1的数目的子串,而且是差值越大越好,那么我们将1看作-1,0看作1,求最大连续区间和,该值就是我们最多可以通过反转再得到的1的数目,加上串中本来的1的数目就是答案

#define ll long long
#define inf 0x3f3f3f3f
#define MAX 10000007
#define vec vector<int>
#define P pair<int,int>

int main() {
	string s; int n, dp[MAX], sum;
	while (cin >> n >> s) {
		if (n == 0) { cout << 0 << endl; continue; }
		int ma = -1, v; sum = 0;
		memset(dp, 0, sizeof(dp));
		if (s[0] == '0')dp[0] = 1, ma = 1;
		else dp[0] = -1, sum++;
		//翻转0的话:等价于将0看作1,1看作-1的最大连续区间和的问题
		for (int i = 1; i < n; i++) {
			if (s[i] == '1')sum++, v = -1;
			else v = 1;
			if (dp[i - 1] > 0)dp[i] = dp[i - 1] + v;
			else dp[i] = v;
			if (dp[i] > ma)ma = dp[i];
		}
		if (ma >= 0)cout << ma + sum << endl;
		else cout << sum << endl;
	}
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发