一个环,有n个点, 问从0点出发,经过k步回到原点有多少种方法
来源:互联网 发布:数据工资保密协议 编辑:程序博客网 时间:2024/04/30 18:04
一个环,有n个点, 每次只能走一步, 问从原点0出发,经过k步回到原点有多少种方法?
0
/ \
/ \
2 ---------1
现在把环上的点编号为0 到 n-1, 即从0点出发,再回到0点有多少种方法?
我们可以想到,再回到0点可以从右面回来,也可以从左面回来,即先到达旁边的一个点,看看有多少回来的方法即可。所以运用动态规划的思想,我们可以写出递推式如下:
d(k, j) = d(k-1, j-1) + d(k-1, j+1);
d(k, j)表示从点j 走k步到达原点0的方法数, 因此可以转化为他相邻的点经过k-1步回到原点的问题,这样将问题的规模缩小。由于是环的问题, j-1, j+1可能会超出 0到n-1的范围,因此,我们将递推式改成如下:
d(k, j) = d(k-1, (j-1+n)%n) + d(k-1, (j+1)%n);
因为问题从走k步转化为走k-1步的问题,所以在写程序的时候我们就按照k从0开始递增的循环写,这样当计算第k步的时候可以直接使用k-1步的结果。
实例如下, n = 3, k = 4
按照k增大计算
012k=0100k=1011k=2211k=3233k=4655因为计算第k步只与第k-1步的值有关,因此可以使用两行的数组来存储。代码如下:
/** * 一个圆环, 有n个点, 从0出发,每次只能走一步,问走k步,有多少种方法可以走回来 */#define N 100int get_step_num(int n, int k){if (n==1){return 1;}if (n==2){if (k%2==0)return 1;else return 0;}int arr[2][N] = {0};int flag = 1, i = 0, j = 0;arr[0][0] = 1;for (i=1; i<n; i++){arr[0][i] = 0;}// j is the current stepfor (j=1; j<=k; j++){for (i=0; i<n; i++){arr[flag][i] = arr[!flag][(i-1+n)%n] + arr[!flag][(i+1)%n];}flag = !flag;}return arr[!flag][0];}int main(){int n, k;printf("Please input the number n and the step k:\n");scanf("%d%d", &n, &k);printf("%d\n", get_step_num(n, k));return 0;}
- 一个环,有n个点, 问从0点出发,经过k步回到原点有多少种方法
- 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数---矩阵乘法
- 【 CodeForces 209C】 【欧拉回路推结论+并查集计算联通分量】 【给定n点m边无向图,可能有自环和重边。 问最少添加多少条边后,使得图存在从点1出发发又回到点1的欧拉回路】
- C++求解:平面上有n个点,问总共可以组成多少条直线
- 求在m*n矩阵当中,从左上角出发到右下角有多少种方法
- 现有一个m * n的网格,从最左上角出发,每次只能向右或者向下移动一格,问有多少种不同的方法可以到达最右下角的格子
- n个点可以有多少形态的二叉树
- hdu 5001 从任意点出发任意走d步不经过某点概率
- 微软面试题:站在地球上的某一点,向南走一公里,然后向东走一公里,最后向北走一公里,回到了原点。地球上有多少个满足这样条件的点?
- 【一道数学题】从(0,0)点经过(x,y)点到达(a,b)点的最短路径有多少条
- 求从一个矩形的一个点到其对角点有多少种走法
- HDU 1312 统计有多少个点
- HDU 1312 统计有多少个点
- 从0开始到N有多少个1
- 求从0到n一共有多少个1
- 一个整数阶乘N!末尾有多少个0
- Educational Codeforces Round 8 E. Zbazi in Zeydabad(给你一个n*m矩阵,每个点可能是'.'或者'z',问有多少种Z子型(Z为一个正方形))
- 记一个经典题: 找到在一颗树中,距离<(=)k的点 有多少对?
- 各种宽高
- java 面试题 string 创建几个对象
- 38 WPF 程序设计指南 RadialGradientBrush
- A First Look At Input/Output
- C++ 虚函数表解析
- 一个环,有n个点, 问从0点出发,经过k步回到原点有多少种方法
- web打印去掉页眉和页脚
- nano编辑器使用教程
- 深入理解C++的动态绑定和静态绑定
- php中Http请求!
- 小米 笔试
- windows7 安装IIS7.5图文教程
- auto_ptr类的源码注解
- 7天学习opengl入门