[luogu p1057] 传球游戏
传球游戏
题目描述
上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。
游戏规则是这样的:
聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了
输入输出格式
输入格式
一行,有两个用空格隔开的整数
输出格式
输入输出样例
输入样例 #1
3 3
输出样例 #1
2
说明
40%的数据满足:
100%的数据满足:
2008普及组第三题
分析
首先这道题我们应该能看出来是一道递推题。再仔细一看,这就是dp
!
我们来找找规律。这里有点纠结的是环问题(不是图论的那个),这里我们采用倍长法。啥意思呢?看下(假设1号是小蛮。):
这是n=5
时的传球情况。横着的表示同学编号,其中1
是小蛮本人,竖着的代表传了多少次球,0
表示初始状态。而表格中的数,代表传了多少次球传到当前同学的方案数。就设它是
首先初始状态下,小蛮接收到球的方案数显然是1
,也就是不传这个方案,其他同学接到球的方案都是0
,因为小蛮还没把球传给别人。此时小蛮拥有了1
种让球回到自己身上的方案。
如果进行了1
次传球,小蛮只能给相邻的5
号和2
号,所以进行1
次传球的情况中,只有2
号同学和5
号同学都有1
种方案,其他都是0
。此时小蛮拥有了0
种让球回到自己身上的方案。
如果进行了2
次传球,2
可能会还给1
(小蛮),也可能会给3
号。5
可能会还给1
(还是小蛮),也可能会给4
号,也就是说3
和4
都各自有1
种方案。但是小蛮此时可能会收到来自2
的,也可能是来自5
的,于是小蛮拥有了2
种求回到自己身上的方案。
这么分叉下去好像有点乱,是到找规律的时候了。我们发现,一个人被传到的方案数是上一轮中和这个人相邻的两个人传球的方案数之和。为什么呢?因为球只能相邻之间传,所以要不然上一轮左边那个给我,要不然右边那个给我,方案数自然是两者之和,不多不少。
稍等,我还没解释什么是倍长法。只要你有眼睛如果你足够细心会发现上面那个表里面队列出现了两次。这其实是为了把尾部和头部衔接。实际编码中我们不需要这么做,加个特判就ok了,这其实只是一个更好理解的方法。
总结一下,
此为不严谨写法,这个等式的优先级按照从上到下排列,如果上面的下面的式子同时满足后面的条件,取上面的。
那个表我是用Excel
打的,这是我每一个区域的计算公式(不懂直接跳过就可以了),供参考。
=IF(COLUMN()<=6,IF(COLUMN()<>2,INDIRECT(ADDRESS(ROW()-1,COLUMN()-1))+INDIRECT(ADDRESS(ROW()-1,COLUMN()+1)),INDIRECT(ADDRESS(ROW()-1,COLUMN()+1))+INDIRECT(ADDRESS(ROW()-1,6))),INDIRECT(ADDRESS(ROW(),COLUMN()-5)))
代码
/*
* @Author: crab-in-the-northeast
* @Date: 2020-03-03 21:36:03
* @Last Modified by: crab-in-the-northeast
* @Last Modified time: 2020-03-03 23:12:37
*/
#include <iostream>
#include <cstdio>
const int maxn = 35;
int dp[maxn][maxn];
int main() {
int n, m;
scanf("%d%d",&n,&m);
dp[0][1] = 1;
for(int i = 1; i <= m; i++) {
dp[i][1] = dp[i - 1][n] + dp[i - 1][2];
dp[i][n] = dp[i - 1][n - 1] + dp[i - 1][1];
for(int j = 2; j <= n - 1; j++)
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1];
}
printf("%d\n",dp[m][1]);
return 0;
}
评测结果
AC 100
:R31341950
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】