演算法提高 超級瑪麗

一名路過的小碼農啊發表於2017-03-12
 演算法提高 超級瑪麗  
時間限制:1.0s   記憶體限制:256.0MB
    
問題描述
  大家都知道"超級瑪麗"是一個很善於跳躍的探險家,他的拿手好戲是跳躍,但它一次只能向前跳一步或兩步。有一次,他要經過一條長為n的羊腸小道,小道中有m個陷阱,這些陷阱都位於整數位置,分別是a1,a2,....am,陷入其中則必死無疑。顯然,如果有兩個挨著的陷阱,則瑪麗是無論如何也跳過不去的。
  現在給出小道的長度n,陷阱的個數及位置。求出瑪麗從位置1開始,有多少種跳躍方法能到達勝利的彼岸(到達位置n)。
輸入格式
  第一行為兩個整數n,m
  第二行為m個整數,表示陷阱的位置
輸出格式
  一個整數。表示瑪麗跳到n的方案數
樣例輸入
4 1
2
樣例輸出
1
資料規模和約定
  40>=n>=3,m>=1
  n>m;
  陷阱不會位於1及n上
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int n,m;
int main() {
	cin>>n>>m;
	vector<int>ans(n+1,-1);
	for(int i=0;i<m;i++)
	{
		int a;cin>>a;
		ans[a]=0;
	}
	ans[1]=1;
	ans[2]=ans[2]==0?0:1;
	for(int i=3;i<=n;i++)
	{
		if(ans[i])ans[i]=ans[i-1]+ans[i-2];
	} 
	cout<<ans[n]<<endl;
	return 0;	
}

斐波那契的變形,在第二個位置如果有陷阱就是0,沒有陷阱就是1

1 1 2 3 5 8...

相關文章