圆环回原点问题

问题描述

一个环上有10个点,编号为0-9,从0点出发,每步可以顺时针到下一个点,也可以逆时针到上一个点,求:经过n步又

回到0点有多少种不同的走法
image
举例:

如果n=1,则从0出发只能到1或者9,不可能回到0,共0种走法

如果n=2,则从0出发有4条路径:0->1->2, 0->1->0, 0->9->8, 0->9->0,其中有两条回到了0点,故一共有2种走法

思路(动态规划)

  • 我们可以想到,再回到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步的结果。

go实现

//n 代表点的个数,k代表bushu
func GetSteps(n int, k int) int {
	if n == 0 {
		return 1
	}
	if n == 2 {
		if n%2 == 0 {
			return 1
		} else {
			return 0
		}
	}
	var dp [100][100]int

	dp[0][0] = 1
	for i := 1; i < n; i++ {
		dp[0][i] = 0
	}
	for j := 1; j <= k; j++ {
		for i := 0; i < n; i++ {
			dp[j][i] = dp[j-1][(i-1+n)%n] + dp[j-1][(i+1)%n]
		}
	}
	return dp[k][0]
}

发布了51 篇原创文章 · 获赞 33 · 访问量 4万+
展开阅读全文

从A 点到 B点恰好经过k个点的方案数 可以走重复边。如果不存在这样的走法,C语言

03-11

Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线去教室, 但是由于时间问题, 每次只能经过k个地方, 比方说, 这次葱头决定经过2个地方, 那他可以先去问鼎广场看看喷泉, 再去教室, 也可以先到体育场跑几圈, 再到教室. 他非常想知道, 从A 点恰好经过k个点到达B点的方案数, 当然这个数有可能非常大, 所以你只要输出它模上1000的余数就可以了. 你能帮帮他么?? 你可决定了葱头一天能看多少校花哦 Input 输入数据有多组, 每组的第一行是2个整数 n, m(0 < n <= 20, m <= 100) 表示校园内共有n个点, 为了方便起见, 点从0到n-1编号,接着有m行, 每行有两个整数 s, t (0<=s,t<n) 表示从s点能到t点, 注意图是有向的.接着的一行是两个整数T,表示有T组询问(1<=T<=100), 接下来的T行, 每行有三个整数 A, B, k, 表示问你从A 点到 B点恰好经过k个点的方案数 (k < 20), 可以走重复边。如果不存在这样的走法, 则输出0 当n, m都为0的时候输入结束 Output 计算每次询问的方案数, 由于走法很多, 输出其对1000取模的结果 Sample Input 4 4 0 1 0 2 1 3 2 3 2 0 3 2 0 3 3 3 6 0 1 1 0 0 2 2 0 1 2 2 1 2 1 2 1 0 1 3 0 0 Sample Output 2 0 1 3 问答

使用C编程语言计算:王”连续移动恰好K步,一共可以有多少种不同的移动方案

04-29

Problem Description   小度和小良最近又迷上了下棋。棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M)。在他们的规则中,“王”在棋盘上的走法遵循十字路线。也就是说,如果“王”当前在(x,y)点,小度在下一步可以移动到(x+1, y), (x-1, y), (x, y+1), (x, y-1), (x+2, y), (x-2, y), (x, y+2), (x, y-2) 这八个点中的任意一个。    图1 黄色部分为棋子所控制的范围   小度觉得每次都是小良赢,没意思。为了难倒小良,他想出了这样一个问题:如果一开始“王”在(x0,y0)点,小良对“王”连续移动恰好K步,一共可以有多少种不同的移动方案?两种方案相同,当且仅当它们的K次移动全部都是一样的。也就是说,先向左再向右移动,和先向右再向左移动被认为是不同的方案。   小良被难倒了。你能写程序解决这个问题吗? Input 输入包括多组数据。输入数据的第一行是一个整数T(T≤10),表示测试数据的组数。 每组测试数据只包括一行,为五个整数N,M,K,x0,y0。(1≤N,M,K≤1000,1≤x0≤N,1≤y0≤M) Output 对于第k组数据,第一行输出Case #k:,第二行输出所求的方案数。由于答案可能非常大,你只需要输出结果对9999991取模之后的值即可。 Sample Input 2 2 2 1 1 1 2 2 2 1 1 Sample Output Case #1: 2 Case #2: 4 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览