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

· · 题解

本题显然是线性 DP,复杂度是 O(nm)。DP 大致思路,分类讨论如下。

下面是代码部分。

#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;
}