牛客春招刷题训练营 - 2025.4.30 题解

活动地址:牛客春招刷题训练营 - 编程打卡活动

Easy 游游的整数切割

简要题意

给一个正整数,求把它划为前后两部分,使得两个数相加为偶数的方案数。

Solution

相当于数有多少个位置的奇偶性与最低位相同。

Code

void R()
{
	int ans=0;
	string s;
	cin>>s;
	for (char c:s)
		ans+=!((c^s.back())&1);
	cout<<ans-1;
	return;
}

Medium 矩阵的最小路径和

简要题意

给一个 的矩阵,选择一条从左上到右下的最短非降路径,记路径上各格内数字之和为该路径的权值,求最小路径权值。

Solution

的最小路径权值,有转移:

即为答案。

Code

void R()
{
	constexpr int inf=1e9;
	int n,m;
	cin>>n>>m;
	vector<vector<int>> a(n,vector<int>(m,inf)),dp(a);
	for (int i=0;i<n;i++)
		for (int j=0;j<m;j++)
			cin>>a[i][j];
		
	dp[0][0]=a[0][0];
	for (int i=0;i<n;i++)
		for (int j=0;j<m;j++)
		{
			if (i) dp[i][j]=min(dp[i][j],dp[i-1][j]+a[i][j]);
			if (j) dp[i][j]=min(dp[i][j],dp[i][j-1]+a[i][j]);
		}
	cout<<dp[n-1][m-1];
	return;
}

Hard 旅游

简要题意

给定一棵 点的树,起初树上每个节点都未染色,随后每次可以选择一个未染色节点,将它和与其相邻的节点都染色。钦定第一次染色节点为 ,求最多能进行多少次染色。

Solution

先钦定 为树根。

分别表示节点 不曾被选择/被选择时,其子树内最多能进行多少次染色,有转移:

即为答案。

Code

void R()
{
	int n,s;
	cin>>n>>s;
	s--;
	vector<int> dep(n);
	vector<vector<int>> adj(n),dp(n,vector<int>(2));
	for (int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		u--,v--;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}

	auto dfs=[&](auto &self,int u,int f)->void
	{
		dp[u][1]=1;
		for (int v:adj[u])
		{
			if (v==f) continue;
			dep[v]=dep[u]+1;
			self(self,v,u);
			dp[u][0]+=max(dp[v][0],dp[v][1]);
			dp[u][1]+=dp[v][0];
		}
	};

	dfs(dfs,s,s);
	cout<<dp[s][1];
	return;
}
#牛客春招刷题训练营#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务