2021百度之星初赛一 1003.鸽子(小dp)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021百度之星初赛一 1003.鸽子(小dp)相关的知识,希望对你有一定的参考价值。
考虑定义 f [ i ] [ j ] f[i][j] f[i][j]表示考虑 [ 1 , i ] [1,i] [1,i]的指令,现在坏电脑在 j j j位置需要忽略的最少操作
如果忽略这条指令显然有 f [ i ] [ j ] = f [ i − 1 ] [ j ] + 1 f[i][j] = f[i-1][j]+1 f[i][j]=f[i−1][j]+1
如果不忽略这条指令
考虑 j = = l i j==l_i j==li,有 f [ i ] [ j ] = f [ i − 1 ] [ l i ] f[i][j]=f[i-1][l_i] f[i][j]=f[i−1][li]
考虑 j = = r i j==r_i j==ri,有 f [ i ] [ j ] = f [ i − 1 ] [ r i ] f[i][j]=f[i-1][r_i] f[i][j]=f[i−1][ri]
否则, f [ i ] [ j ] = f [ i − 1 ] [ j ] f[i][j]=f[i-1][j] f[i][j]=f[i−1][j]
也就是每次转移,对于 j ! = l i & & j ! = r i j!=l_i\\&\\&j!=r_i j!=li&&j!=ri的状态直接保留就好了,对于其他两个状态额外转移即可
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
const int inf = 1e9;
int l[maxn],r[maxn],f[maxn],n,m,k;
int main()
{
int t; cin >> t;
while( t-- )
{
cin >> n >> m >> k;
for(int i=1;i<=n;i++) f[i] = inf;
for(int i=1;i<=m;i++) scanf("%d%d",&l[i],&r[i] );
f[k] = 0;
for(int i=1;i<=n;i++)
{
int L = min( f[r[i]]+1, f[l[i]] ), R = min( f[l[i]]+1, f[r[i]] );
f[l[i]] = R; f[r[i]] = L;
}
for(int i=1;i<=n;i++)
{
if( f[i]==inf ) f[i] = -1;
printf("%d%c",f[i],i==n?'\\n':' ');
}
}
}
以上是关于2021百度之星初赛一 1003.鸽子(小dp)的主要内容,如果未能解决你的问题,请参考以下文章
2016"百度之星" - 初赛(Astar Round2A) 1004 D Game 区间DP
2016"百度之星" - 初赛(Astar Round2B)1003 瞬间移动 组合数学+逆元
2016-5-21 letwetell Round3 (百度之星初赛,dfs序)