专栏文章
题解:P10043 [CCPC 2023 北京市赛] 广播
P10043题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miorczxf
- 此快照首次捕获于
- 2025/12/02 23:53 3 个月前
- 此快照最后确认于
- 2025/12/02 23:53 3 个月前
本题显然是线性 DP,复杂度是 。DP 大致思路,分类讨论如下。
- 如果我们发现 两者相等或是其中有至少一个是 ,那么我们显然可以考虑继承 的状态,或者选择继承 或者 的状态并且补一个一!但是我们发现 或者 这个状态是不可能比 优的(本质上是由这个状态转移过去的,所以一定不够优),所以直接继承 的状态;
- 其余的情况,可以直接转移 、 中小的那个,原因显而易见同上。
下面是代码部分。
CPP#include <iostream>
#include <cstring>
using namespace std;
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n;
int m;
constexpr int maxn = 2007;
alignas(64)short a[maxn];
alignas(64)short b[maxn];
alignas(64)short dp[maxn][maxn];
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] = dp[i-1][j-1];
else
dp[i][j] = min(dp[i][j-1]+1,dp[i-1][j]+1);
}
}
short ans = 30000;
for(int i = 0;i<=m;++i)
ans=min(ans,dp[n][i]);
for(int i = 0;i<=n;++i)
ans=min(ans,dp[i][m]);
cout<<ans;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...