首页 > 其他分享 >题解:P10043 [CCPC 2023 北京市赛] 广播

题解:P10043 [CCPC 2023 北京市赛] 广播

时间:2024-07-26 09:39:50浏览次数:15  
标签:初值 int 题解 CCPC cin 2023 2010 dp

博客使用更佳:My blog

题目传送门

这道题是一个标准的 dp 了,只不过它要倒序来做。

还是分三步。

  1. 初值:初值想必都知道吧,若要求最小值,就把初值设成无穷大,\(dp_{0,i}\) 和 \(dp_{i,0}\) 都要设成 \(i\),\(dp_{0,0}\) 一定要赋值成 \(0\),这是本人亲自犯过的错误QwQ。

  2. 状态:\(dp_{i,j}\) 表示 \(a\) 数组的前 \(i\) 个,\(b\) 数组的前 \(j\) 个变成可以广播的情况需要最小的操作次数。

  3. 答案:只要有一个走到头时说明这种情况已经解决完毕,当 \(i\) 是 \(n\) 或者 \(j\) 是 \(m\) 时取最小值。

千万要把 \(dp_{0,m}\),\(dp_{n,0}\) 算上QwQ。

话不多说,直接上代码。

#include <bits/stdc++.h>
using namespace std;

int n,m;
int a[2010], b[2010];
int dp[2010][2010];

int main() 
{
	memset(dp,0x3f,sizeof dp);
	cin >> n >> m;
	dp[0][0] = 0;
	for (int i = n; i >= 1; i--)
	{
		cin >> a[i];
		dp[i][0] = i;
	}
	for (int i = m; i >= 1; i--)
	{
		cin >> b[i];
		dp[0][i] = i;
	}
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			if(a[i] == b[j] || a[i] == 1 || b[j] == 1) dp[i][j] = min({dp[i - 1][j - 1],dp[i][j - 1] + 1,dp[i - 1][j] + 1});
			else dp[i][j] = min(dp[i - 1][j] + 1,dp[i][j - 1] + 1);
	int ans = 0x3f3f3f3f;
	for (int i = 0; i <= m; i++) ans = min(dp[n][i],ans);
	for (int i = 0; i <= n; i++) ans = min(dp[i][m],ans);
	cout << ans;
    return 0;
}

有兴趣的童鞋们可以挑战一下 编辑距离

标签:初值,int,题解,CCPC,cin,2023,2010,dp
From: https://www.cnblogs.com/0x3f3f3f3f3f3f/p/18324687

相关文章

  • AtCoder Beginner Contest 360 题解(C-E)
    C-MoveIt题目链接:C-MoveIt题目大意:有\(N\)个盒子和\(N\)个物品编号为\(1-N\),物品\(i\)在盒子\(A_i\)中,重量为\(W_i\),你可以进行一种操作将盒子中的一件物品移动到其他任意盒子中,代价为\(W_i\),求使得所有盒子中只存在一件物品的最小操作代价。题解:贪心,可以发现......
  • CF1843F2 题解
    题面注意到边权只有\(1,-1\),所以有结论:存在值为\(v\)的子段当且仅当\(v\in[\)最小子段和,最大子段和\(]\)。证明:因为移动区间端点,区间和变化连续(+1/-1),从最小子段移动到最大子段,子段和一定经过\(v\),所以得证。于是只要树剖维护最小最大子段和即可。和线段树上维护的数据......
  • CF440D 题解
    题面注意到划分完这棵树以后,每条连通块之间的边的一端一定相同,且是大小为\(k\)的连通块。于是考虑这个连通块的最高点,设\(f(i,j)\)为\(i\)点所在连通块大小为\(j\)时所需的最小边数。令\(f'(i)\)为原来的\(f(i)\)。对于\(i\)的每个\(s\inson(i)\),枚举从\(s\)......
  • CF56E 题解
    题面设骨牌\(i\)倒下之后会连带压倒\([i+1,r_i]\)的骨牌,那么有\(z_i=\max_{j=i+1}^{r_i}z_j+(j-i)\)考虑线段树优化dp,但是\((j-i)\)不好维护,所以套路地修改式子,得到:\(z_i+i=\max_{j=i+1}^{r_i}(z_j+j)\)所以线段树维护\(z_i+i\)的区间最大值即可,\(r_i\)可以二分求......
  • CF86D 题解
    题面看起来线段树之类的不好维护,但是移动区间的增量很好求,数据范围也能过,那么直接莫队就行了。设加入或删除了值\(x\),设原来区间内有\(cnt_x\)个,现在有\(cnt'_x\)个,那么增量就是\(x((cnt'_x)^2-(cnt_x)^2)\),直接求就好了。复杂度\(O(t\sqrtn)\)。#include<bits/stdc+......
  • CF567E 题解
    题面考虑如何一条边是必经之路:设\(cntl_i\)为从\(s\)到\(i\)走最短路的方案数,\(cntr_i\)为从\(i\)到\(t\)最短路方案数。由乘法原理,如果对于边\(e_i=(u,v)\),\(cnt_t=cnt_u\timescntr_v\),则\(e_i\)是最短路上的必经边,输出Yes即可。如果\(cnt_u\timescntr_v=0......
  • 【题解】Solution Set - 杂题选讲「刘君实」
    https://www.becoder.com.cn/contest/5423「HNOI2012」集合选数感觉差不多会。7/25sh杂题听课情况NOI2018冒泡排序【40】几乎不会麦田里的守望者【40】打表找规律、最后dp不太理解星空列车【40】完全不会WereYouLast:知道怎么做,但是不知道为什么是对的A......
  • CF467E 题解
    题面给出这种限制,我们只能4个4个考虑。令\(f_i\)为考虑到\(a_i\),最长的\(b\)序列长\(4f_i\)。令\(mx_i\)为以\(a_i\)结尾的最短连续子序列包含\(x\y\x\y\)的(不一定连续的)结构的左端点。于是有\(f_i=\max_{j=1}^{mx_i-1}f_j+4\)。用前缀和优化:\(g_i=\max......
  • CHES 2023 issue-1文章总结
    来源:https://ches.iacr.org/2023/acceptedpapers.php简要分类:分类文章编号后量子密码软硬件加速相关无侧信道攻防相关1,2,3,4,5,6,8,9,12,13同态相关15,16,17,18,191.RiskyTranslations:SecuringTLBsagainstTimingSideChannelsFlorianSto......
  • CF594A 题解
    题面来个不一样的证明。根据样例,我们可以有一个直觉:两点之间一定距离\(\fracn2\),答案为这样的点对之间\(\Deltax\)的最小值。直接交上去,发现这是对的。为什么呢?先证明上界:先手可以让答案小于等于两点距离\(\fracn2\)点对的\(\Deltax\)的最小值。这是容易的:先手只......