cf1204D(div2)

4 篇文章 0 订阅
3 篇文章 0 订阅

字符串好题

题意:

  • 给定01串s
  • 要求找一个同等长度的01串t, 且要求在任意相同区间内, s和t拥有相同的最长不下降子序列, 且要求’0’的字符最多;

easy-version数据范围: n ≤ 2000 n \leq 2000 n2000

>> face <<

dp

试了几个例子之后发现每个地方的改动只对后方的数组有影响, 于是发现必须倒着遍历, 然后暴力求出每个串的最长不下降子序列, 然后靠暴力比较每个子区间的最长不下降长度, 如果改了之后和原来不一样就改回来

#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define _rev(i, a, b) for (int i = (a); i >= (b); --i)
#define _for(i, a, b) for (int i = (a); i < (b); ++i)
#define _rof(i, a, b) for (int i = (a); i > (b); --i)
#define oo 0x3f3f3f3f
#define ll long long
#define db double
#define eps 1e-8
#define bin(x) cout << bitset<10>(x) << endl;
#define what_is(x) cerr << #x << " is " << x << endl;
#define met(a, b) memset(a, b, sizeof(a))
#define all(x) x.begin(), x.end()
#define pii pair<int, int>
const int maxn = 2e3 + 10;
int nxt() {
	int ret;
	scanf("%d", &ret);
	return ret;
}
int val[2][maxn];
string a;
void LIS(string w, int st, int s) {
	int max0 = 0; int max1 = 0;
	_for(i, st, w.size()) {
		if (w[i] == '0')max0++;
		else
			max1 = max(max0, max1) + 1;
		val[s][i] = max(max0, max1);

	}
}
int main() {
	ios::sync_with_stdio(0);
	cin >> a;
	string t(a);
	for (int i = a.size() - 1; i >= 0; i--) {
		if (a[i] == '1') {
			t[i] = '0';
			LIS(t, i, 1);
			LIS(a, i, 0);
			_for(j, i, a.size()) {
				if (val[1][j] != val[0][j]) {
					t[i] = '1';
					break;
				}
			}
		}
	}
	cout << t << endl;
}

hard-version数据范围: n ≤ 10000 n \leq 10000 n10000

>> face <<

dp

仔细考虑: 若 s [ i ] = = 1 s[i] == 1 s[i]==1, 我们把它改成0会有什么影响: 以该位置上1开头的LIS不变, 以该位置上0开头的LIS长度++(dp[0][i+1]+1), 而题目要保证区间LIS最大不变, 则我们控制最大的LIS是以该位置上1开头的LIS, 所以只有当(dp[1][i] >= dp[0][i + 1] + 1)的时候可以改动, 而且改动过以后还要修改dp数组, 消除后效性

#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define _rev(i, a, b) for (int i = (a); i >= (b); --i)
#define _for(i, a, b) for (int i = (a); i < (b); ++i)
#define _rof(i, a, b) for (int i = (a); i > (b); --i)
#define oo 0x3f3f3f3f
#define ll long long
#define db double
#define eps 1e-8
#define bin(x) cout << bitset<10>(x) << endl;
#define what_is(x) cerr << #x << " is " << x << endl;
#define met(a, b) memset(a, b, sizeof(a))
#define all(x) x.begin(), x.end()
#define pii pair<int, int>
const int maxn = 1e5 + 5;
string s;
int dp[2][maxn];
signed main()
{
	cin >> s;
	for (int i = s.size() - 1; i >= 0; i--)
	{
		if (s[i] == '1')
		{
			dp[1][i] = dp[1][i + 1] + 1;
			dp[0][i] = dp[0][i + 1];
		}
		else
		{
			dp[0][i] = max(dp[0][i + 1], dp[1][i + 1]) + 1;
			dp[1][i] = dp[1][i + 1];
		}
	}
	for (int i = s.size() - 1; i >= 0; i--)
	{
		if (s[i] == '1')
		{
			if (dp[1][i] >= dp[0][i + 1] + 1)
			{
				s[i] = '0';
				dp[0][i] = max(dp[0][i], dp[0][i + 1] + 1);
				dp[1][i] = dp[1][i + 1];
			}
		}
		else
		{
			dp[0][i] = max(dp[0][i + 1], dp[1][i + 1]) + 1;
			dp[1][i] = dp[1][i + 1];
		}
	}
	cout << s << endl;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<div id="wea_rich_text_default_font" style="font-family:微软雅黑;font-size:12;"><p><img alt="" src="/weaver/weaver.file.FileDownload?fileid=aaa9aee4717d33272bd7ea028fa03118b693919f23b18febf9f6cee1158e8f4cf027542c71c8cf98d63770ccdf3bd1750e6b92e28c43dccd4" /></p><div class="ckeditor-html5-video" data-widget="html5video" style="text-align:left"><video controls="controls" src="/weaver/weaver.file.FileDownload?fileid=aad6f413f83191673980c5ee24b412880d6b9e8703caca411faec3276fe8133f5fa7e34630ca89ace63770ccdf3bd175071362141037cfb4e&download=1" style="max-width:100%"> </video></div><table border="1" cellpadding="1" style="width:500px;"> <tbody> <tr> <td style="padding: 1px;">1</td> <td style="padding: 1px;">1</td> </tr> <tr> <td style="padding: 1px;">2</td> <td style="padding: 1px;">2</td> </tr> <tr> <td style="padding: 1px;">3</td> <td style="padding: 1px;">3<a href="http://localhost:8080/wui/index.html#/main/portal/portal-1-1?menuIds=0,1&menuPathIds=0,1&_key=zq8830" target="_blank">http://localhost:8080/wui/index.html#/main/portal/portal-1-1?menuIds=0,1&menuPathIds=0,1&_key=zq8830</a></td> </tr> </tbody></table><p>测试<a href="http://localhost:8080/wui/index.html#/main/portal/portal-1-1?menuIds=0,1&menuPathIds=0,1&_key=zq8830" target="_blank">http://localhost:8080/wui/index.html#/main/portal/portal-1-1?menuIds=0,1&menuPathIds=0,1&_key=zq8830</a></p><p> </p><p>修改一下吧 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<img alt="" src="/weaver/weaver.file.FileDownload?fileid=a7617945ec5f52ec80aaa43ee8504de0a1b14d5eca4a98834494c85349762c626dec7ba8d0da277106ee600d27743f4e44f710fbddd167603" /></p></div>
最新发布
06-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值