描述
有一個方格矩陣,矩陣邊界在無窮遠處。我們做如下假設:
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;
}