HDU ACM 2232 这道题不会啊,各位大虾帮帮忙类

听榆大叔 Hoomic 技术经理  2010-08-11 06:48:42
机器人的舞蹈
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 54 Accepted Submission(s): 29



Problem Description
一天四个不同的机器人a、b、c和d在一张跳舞毯上跳舞,这是一张特殊的跳舞毯,他由4个正方形毯子组成一个大的正方形毯子,一开始四个机器人分别站在4块毯子上,舞蹈的每一步机器人可以往临近(两个毯子拥有同一条边视为临近)的一个毯子移动或停留在原来的毯子(同一块毯子可以有多个机器人停留),这个时候机器人的制造者你想知道经过n步的移动有多少种方式可以让每个毯子上都有机器人停留。


Input
对于每组数据输入一个整数n(0<=n<=100)




Output
对于每组输入输出一个整数表示方法种数,种数可能很大请对9937取模。



Sample Input
1


Sample Output
9 这题不知从何解起,有人是用矩阵,能否说下原理?

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/womendeaiwoming/archive/2010/08/11/5805008.aspx
...全文
105 点赞 收藏 19
写回复
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
听榆大叔 2010-08-12
fanster28大哥,你用的方法是不是有一种系统的方法呢?感觉见到过几次用这种方法解的……
回复
听榆大叔 2010-08-11
两位,学习了……
回复
听榆大叔 2010-08-11
再理解理解
回复
绿色夹克衫 2010-08-11
嗯,确实是对的,比我的方法要好!开始没有理解,其实是分别求0经过n步后移动到0,1,2,3共有多少种走法,同理,1,2,3也是,然后再分别对24种情况求,最后对24种情况求和。
回复
fanster28_ 2010-08-11
0在0格*1在1格*2*2格*3在3格 就是一种合法状态
24中合法状态加起来就好了
回复
绿色夹克衫 2010-08-11
fanster28的方法似乎是对的,应该是我想多了。
回复
绿色夹克衫 2010-08-11
我说的方法比较朴素,就是把N步之后,256种状态的每一种状态有多少种可能都求出来,然后再对其中各处一格的情况求和。属于最基本的方法,应该可以正确求解。

fanster28的方法,我感觉稍微有些问题,比如n步之后,0处于第0个格有多少种情况,用这个DP求是没问题的,但0处于第0个格时,1可能同时也在第0格,这种情况似乎不太好排除。

不过我觉得肯定有比我所给的方法,更简单的方法求解,因为我的方法每次算81个状态转移,其中有很多可能都是重复计算,这点我就不仔细分析了,算一下小规模的数据,应该看得更清楚。

分不分的无所谓,讨论问题嘛,我也能学习知识。

前段时间fanster28解决的一个DP问题,就让我学习了。
[Quote=引用 10 楼 womendeaiwoming 的回复:]

litaoye大哥 你那DP感觉不太像啊,想不出可行性 所以只你10分了 可否详细?
[/Quote]
回复
fanster28_ 2010-08-11
每种合法状态 内部是用乘法
回复
fanster28_ 2010-08-11
最后只需要枚举4!种合法状态 把他们加起来就好了

用next_permutation
回复
听榆大叔 2010-08-11
litaoye大哥 你那DP感觉不太像啊,想不出可行性 所以只你10分了 可否详细?
回复
听榆大叔 2010-08-11
[Quote=引用 2 楼 fanster28_ 的回复:]
位置编号为
0 1
3 2
dp[n][i] 表示n步之后位置0的人停留在位置i的方案数
dp[n][0]=dp[n-1][0]+dp[n-1][1]*2
dp[n][1]=dp[n-1][1]+dp[n-1][0]+dp[n-1][2]
dp[n][2]=dp[n-1][1]+dp[n-1][1]+dp[n-1][3]
dp[n][3]=dp[n][1]
显然位置在1 2 3的……
[/Quote]

貌似有点小错误?
dp[n][0]=dp[n-1][0]+dp[n-1][1]*2(即dp[n-1][1]==dp[n-1][3])
dp[n][1]=dp[n-1][1]+dp[n-1][0]+dp[n-1][2]
dp[n][2]=dp[n-1][1]+dp[n-1][1]+dp[n-1][3](这里是不是应该改成dp[n-1][1]+dp[n-1][2]+dp[n-1][3])
dp[n][3]=dp[n][1]

另外,能不能再详细说明一点如何枚举呢 。。。。 呵呵,新手,不太会
回复
听榆大叔 2010-08-11
[Quote=引用 7 楼 litaoye 的回复:]
每个机器人可以有4种位置,4个机器人,所以总共4^4。


引用 6 楼 womendeaiwoming 的回复:

状态数不对吧,因为一个格子上的机器人只可能是0-4个,而当一个格子的机器人的为4个时,其它的格子上是不可能有机器的人,也就是说四个格子上的机器的数目是相互牵制的,而并不是没有关联的,所以应该不能简单地用4^4来计算吧……???
[/Quote]

嗯,确实! 我想得太复杂了! 把高中学过的都忘了 呵呵 ,还得换个方向思考啊,脑袋是越来越迟盾了
回复
绿色夹克衫 2010-08-11
每个机器人可以有4种位置,4个机器人,所以总共4^4。

[Quote=引用 6 楼 womendeaiwoming 的回复:]

状态数不对吧,因为一个格子上的机器人只可能是0-4个,而当一个格子的机器人的为4个时,其它的格子上是不可能有机器的人,也就是说四个格子上的机器的数目是相互牵制的,而并不是没有关联的,所以应该不能简单地用4^4来计算吧……???
[/Quote]
回复
听榆大叔 2010-08-11
状态数不对吧,因为一个格子上的机器人只可能是0-4个,而当一个格子的机器人的为4个时,其它的格子上是不可能有机器的人,也就是说四个格子上的机器的数目是相互牵制的,而并不是没有关联的,所以应该不能简单地用4^4来计算吧……???
回复
绿色夹克衫 2010-08-11
感觉Dp部分是没问题的,最后求值部分,最好讲细一点,感觉似乎有些问题!

[Quote=引用 2 楼 fanster28_ 的回复:]

位置编号为
0 1
3 2
dp[n][i] 表示n步之后位置0的人停留在位置i的方案数
dp[n][0]=dp[n-1][0]+dp[n-1][1]*2
dp[n][1]=dp[n-1][1]+dp[n-1][0]+dp[n-1][2]
dp[n][2]=dp[n-1][1]+dp[n-1][1]+dp[n-1][3]
dp[n][3]=dp[n][1]
显然位置在1 2 3……
[/Quote]
回复
绿色夹克衫 2010-08-11
fanster28_同志的方法似乎比我的要好,研究一下!
回复
绿色夹克衫 2010-08-11
状态转移应该有81种,其实就是3^4,所以计算量大概是256 * 81 * n
回复
fanster28_ 2010-08-11
位置编号为
0 1
3 2
dp[n][i] 表示n步之后位置0的人停留在位置i的方案数
dp[n][0]=dp[n-1][0]+dp[n-1][1]*2
dp[n][1]=dp[n-1][1]+dp[n-1][0]+dp[n-1][2]
dp[n][2]=dp[n-1][1]+dp[n-1][1]+dp[n-1][3]
dp[n][3]=dp[n][1]
显然位置在1 2 3的人n步之后的数目不用计算了, 通过位置0的人旋转而得
然后枚举一下四个人在不同位置的个数...
回复
绿色夹克衫 2010-08-11
DP应该可以,用不着矩阵,先推算一下4个机器人和4个格子共有多少种状态,应该是4^4 = 256种,每一种状态经过一步后,又可以转变为其他的状态,预先处理好这些转换的可能,那么f(s,n) = sum(f(s',n-1)),其中s'可以通过1步转化为s。复杂度不超过256^2 * n
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告