2021百度之星初赛一 1003.鸽子(小dp)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021百度之星初赛一 1003.鸽子(小dp)相关的知识,希望对你有一定的参考价值。

LINK

考虑定义 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[i1][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[i1][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[i1][ri]

否则, f [ i ] [ j ] = f [ i − 1 ] [ j ] f[i][j]=f[i-1][j] f[i][j]=f[i1][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序)

2019 年百度之星·程序设计大赛 - 初赛三 1003

HDU 5698 瞬间移动 (2016"百度之星" - 初赛(Astar Round2B) 1003)

hdu 6119 百度之星初赛