未名湖边的烦恼
2018-02-07 20:21
357 查看
一、题目
问题描述 每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。 每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法) 输入格式 两个整数,表示m和n 输出格式 一个整数,表示队伍的排法的方案数。 样例输入 3 2 样例输出 5 数据规模和约定 m,n∈[0,18] 问题分析
二、分析
根据题意首先可得出以下结论。1、当借鞋的个数为0时,排队方式只有1种。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
2、当还鞋个数为0时,排队方式有0种。(无鞋可租)
在明白以上两点之后,设a[m]
的值为还鞋个数为m个时,借鞋个数为n个时,队伍的排法的方案数。
那么有以下矩阵:
m/n 0—1—2—3—4
0—-0—0—0—0—0
1—-1—1—0—0—0
2—-1—2—2—0—0
3—-1—3—5—0—0
4—-1—4—9—14-14
实际情况中不需要写出那么多,写到第3行,3列时就基本能找到规律了。
根据这个矩阵就很容易写出代码。
public class Question122 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String string[] = scanner.nextLine().split(" "); int m = Integer.parseInt(string[0]); int n = Integer.parseInt(string[1]); int a[][] = new int[m + 1][n + 1]; for (int j = 0; j <= n; j++) { a[0][j] = 0;//特殊情况:置为0 } for (int i = 1; i <= m; i++) { a[i][0] = 1;//特殊情况:置为1 } for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { if (j == 1) { a[i][j] = i; } else if (i < j) { a[i][j] = 0;//特殊情况:置为0 } else { a[i][j] = a[i][j - 1] + a[i - 1][j]; } } } System.out.println(a[m] ); } }
We should do the right thing whatever others say.
相关文章推荐
- 未名湖边的烦恼(递归)
- 未名湖边的烦恼
- 未名湖边的烦恼
- 未名湖边的烦恼
- 蓝桥杯未名湖边的烦恼
- 湖边的烦恼-算法训练题
- 蓝桥杯未名湖边的烦恼
- 未名湖边的烦闹
- 四柱HanoiTower----是甜蜜还是烦恼
- 【动态规划】Tom的烦恼 tom.pas/c/cpp/in/out
- [HNOI2008]明明的烦恼 树的 prufer 编码
- 幽默-烦恼
- hdu 4517 小小明系列故事——游戏的烦恼(统计类题目)
- 你还在为答错题而烦恼吗?
- 发呆、打发烦恼
- IE 文档模型设置 免去你IE 按F12去调文档标准的烦恼。
- 就业困难期,他们面临着幸福的烦恼
- FOJ 1591 —— Coral的烦恼
- 程序员成长的烦恼(奋斗的小鸟)_PDF 电子书
- 4.5 《硬啃设计模式》 第22章 增加新方法的烦恼 - 访问者模式(Visitor Pattern)