踩方格(动规递推)

描述

有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:

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;  
}  

 

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