踩方格(動規遞推)

描述

有一個方格矩陣,矩陣邊界在無窮遠處。我們做如下假設:

a、每走一步時,只能從當前方格移動一格,走到某個相鄰的方格上;

b、走過的格子立即塌陷無法再走第二次;

c、只能向北、東、西三個方向走;

請問:如果允許在方格矩陣上走n步,共有多少種不同的方案。2種走法只要有一步不一樣,即被認爲是不同的方案。

格式

輸入格式

允許在方格上行走的步數n(n≤20)。

輸出格式

計算出的方案數量。

樣例

輸入樣例

2

輸出樣例

7

 

這道題用深搜做肯定可能會超時(看數據量要求而定),動規遞推寫法不會超時,當然,對於noip賽制,能拿分最重要(貪心),有總歸比沒有好,所以悟不出動規的狀態轉換公式,那就直接用深搜暴力搜吧。對於動規遞推寫法,很多博文的狀態轉換方程是dp[i]=dp[i-1]*2+dp[i-2];這怎麼推導出來的,沒幾個說清楚(可能我沒搜到)。這裏用了另一種寫法,我認爲很容易明白。

#include<bits/stdc++.h>
using namespace std;

int main()  
{  
	int n;
	scanf ("%d", &n);
	int l[25], r[25], u[25];
	memset(l, 0, sizeof(l));
	memset(r, 0, sizeof(r));
	memset(u, 0, sizeof(u));
	u[0] = 1;
	for (int i=1; i<=n; i++) {
		l[i] = l[i-1] + u[i-1];				//左的第i步來源於它的i-1步上左和向上 
		r[i] = r[i-1] + u[i-1];				//右的第i步來源於它的i-1步上右和向上
		u[i] = l[i-1] + r[i-1] + u[i-1];	//上的第i步來源於它的i-1步上左、向上和向右 
	}
	printf ("%d", u[n]+l[n]+r[n]);			//第n步爲上+左+右 
    return 0;  
}  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章