递推

 1580: 递推专项训练(3)

Time Limit: 1000MS Memory Limit: 65536KB
Total Submit: 11 Accepted: 5 Page View: 265
Submit  Status  Discuss
从原点出发,一步只能向右走、向上走或向左走。恰好走N步且不经过已走的点共有多少种走法?
N范围均为 [1。。。99],并且所有结果应模上1989.
 
   
 
   
2
7

(1)当N=1时,绘出走法图

递推_第1张图片

(图1)共有3种不同的走法,也就是黑色线条的数量,即f(1)=3

(2)当N=2时,绘出走法图

递推_第2张图片

(图2)共有7种不同的走法,也就是绿色线条的数量,即f(2)=7

(3)当N=3时,绘出走法图

递推_第3张图片

(图3)共有17种不同的走法,也就是红色线条的数量,即f(3)=17

由此,我们不难看出,对于任何一个起点,最多可以走出3种走法,但最少必须走出2种走法。那么我们要求出f(n),实际上转换为如果我们能够得到上一步即f(n-1)有多少个终点是有3种走法的,有多少个点有2种走法的,那么问题就解决了。

a. 上一步,即f(n-1)有多少个终点是有3种走法的。

递推_第4张图片

       对于N=3时,f(n-1)=f(2), 有3个点A、B、C可以走出3种不同走法的,这3个点是怎么得到的呢?它的存在与N值有没有必然的联系?如果我们能找到它与N之间的关系,问题也就解决了。有了这样的思路以后,我们不难找到这样的规律:如果f(n-2)存在,即上上步存在,那么从上上步出发的线路里面必然会有一条向上走的线路,而这条向上走的线路在到达f(n-1)之后,  向f(n)出发时也必然有左、上、右这三种走法,那么我们就得出了这样的结论:当f(n-2)存在时,f(n-2)的值实际上就等价于f(n-1)有多少个终点是有3种走法。

         b.    f(n-1)有多少个终点是有2种走法的

递推_第5张图片

对于N=3时,有4个点D、E、F、G可以走出2种不同走法的,这4个点又是怎么得到的呢?它与N值有什么联系呢? 实际上我们在解决了上一个问题的时候,这个问题就变得相当容易了, f(n-1)减掉刚才有3种走法的点,剩下的点不就是只有2种走法了吗?即f(n-1)-f(n-2)。

c. 得出f(n)的一般关系式

f(n)=3*f(n-2)+2*(f(n-1)-f(n-2) ) (n>=3)

化简:

f(n)=2*f(n-1)+f(n-2) (n>=3)

AC 代码

#include <stdio.h>
#include<string.h>
int f[100000];


int main()
{
int n;
f[1]=3;
f[2]=7;
for(int i=3;i<100000;i++)
{
f[i]=(2*f[i-1]%1989+f[i-2]%1989)%1989;
}
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",f[n]);
}
}




 
   

你可能感兴趣的:(递推)