奇怪的電梯 【洛谷】P1135
阿新 • • 發佈:2018-12-15
題目部分
分析
本題的做法很多,如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"); }