1. 程式人生 > >奇怪的電梯 【洛谷】P1135

奇怪的電梯 【洛谷】P1135

題目部分

奇怪的電梯

分析

本題的做法很多,如bfs,dfs等。我今天用了DP做。我來講一下方法: 與其說是DP,不如說是模擬,在模擬中得出DP 首先,開三個陣列,k[],f[],g[]。k是輸入的。f[j]表示到達第j層的時候按了幾次按鈕(i作用並不大,但是卻不能少)。(bool型)g[j]表示能否到達這一層,到達了就標記為1,否則為0。很顯然,最後答案在f[b]裡面。但是如果g[b]是0(到達不了)就輸出-1,否則輸出f[b]。我認為我分析很詳細了,不懂的留言給我

程式碼

時間複雜度:O(n*n)

#include<bits/stdc++.h>
using namespace std;
const int N=300;
bool g[N];
int f[N],k[N],n,A,B;
int main()
{
	scanf("%d%d%d",&n,&A,&B);
	for(int i=1;i<=n;i++)
	 scanf("%d",&k[i]);
	memset(f,0x2f,sizeof(f));
	f[A]=0;
	g[A]=1;
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
	 {
	 	if(j-k[j]>=1&&f[j]+1<=f[j-k[j]])
	 	{
	 		f[j-k[j]]=f[j]+1;
	 		if(g[j]) g[j-k[j]]=1;
	 	}
	 	if(j+k[j]<=n&&f[j]+1<=f[j+k[j]])
	 	{
	 		f[j+k[j]]=f[j]+1;
	 		if(g[j]) g[j+k[j]]=1;
	 	}
	 }
	if(g[B]) printf("%d",f[B]);
	else printf("-1");
}