题解 | #小红的华撃串#

小红的华撃串

https://www.nowcoder.com/practice/6f8a4caace654a82803314c917a58a31

考虑到字符串长度很小,且需要的子串数目为 ,设计动态规划状态为 代表着进行到第 个字符时, 且目前要求子串数目等于 的最小代价,转移时 的增加与减小取决于枚举下一个字符与当前字符是否一致( 大于 的状态直接舍弃), 值的增加取决于枚举的字符相较于原串是否发生改变,时间复杂度为

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const LL maxn=550,inf=1LL<<62,M=1000000007;
LL n,m,ans=inf,a[maxn]={},f[maxn][2][6]={};
char s[maxn]={};
int main(){
	scanf("%lld",&n);scanf("%s",s+1);
	for(LL i=1;i<=n;i++)a[i]=s[i]-'0';
	for(LL p=0;p<=n;p++)for(LL i=0;i<2;i++)for(LL j=0;j<=3;j++)f[p][i][j]=inf;
	for(LL i=0;i<2;i++)
		for(LL j=0;j<2;j++)
			f[2][i][i^j]=min(f[2][i][i^j],(a[2]^i)+(a[1]^j));
	for(LL p=2;p<n;p++){
		for(LL i=0;i<2;i++){
			for(LL j=0;j<=3;j++){
				LL x=f[p][i][j];
				for(LL k=0;k<2;k++)
					f[p+1][k][j+(k^i)]=min(f[p+1][k][j+(k^i)],x+(k!=a[p+1]));
			}
		}
	}
	for(LL i=0;i<2;i++)ans=min(ans,f[n][i][3]);
	printf("%lld",ans);
	return 0;
} 
全部评论

相关推荐

03-12 09:57
软件测试
程序员小白条:1)确定测试,测开的方向,技术栈不能写这么少 2)课程凑数的,不是99,100分没必要写 3)实习经历这块要有突出的不是劳动性质的亮点,自己设计的什么方案,什么自动化?什么提效工具?不是一些边角料,人云亦云的东西,没吸引力 4) 校园经历纯没用 5)尽量少写减分项
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务