描述
有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
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;
}