目录
- T1. 移动路线
- 思路分析
- T2. 移动办公
- 思路分析
- T3. 最长公共子上升序列
- 思路分析
- T4. 技能树
- 思路分析
T1. 移动路线
桌子上有一个 m m m 行 n n n 列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为 ( 1 , 1 ) (1,1) (1,1),则右上角方格的坐标为 ( m , n ) (m,n) (m,n)。
小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁的右脚弄伤了,于是蚂蚁只能向上或向右移动。小明把这只蚂蚁放在左下角的方格中,蚂蚁从左下角的方格中移动到右上角的方格中,每步移动一个方格。蚂蚁始终在方格矩阵内移动,请计算出不同的移动路线的数目。
对于 1 1 1 行 1 1 1 列的方格矩阵,蚂蚁原地移动,移动路线数为 1 1 1 ;对于 1 1 1 行 2 2 2 列(或 2 2 2 行 1 1 1 列)的方格矩阵,蚂蚁只需一次向右(或向上)移动,移动路线数也为 1 1 1;…… 对于一个 2 2 2 行 3 3 3 列的方格矩阵,如下图所示:
(2,1) | (2,2) | (2,3) |
---|---|---|
(1,1) | (1,2) | (1,3) |
蚂蚁共有 3 3 3 种移动路线:
- 路线 1 1 1: ( 1 , 1 ) → ( 1 , 2 ) → ( 1 , 3 ) → ( 2 , 3 ) (1,1) → (1,2) → (1,3) → (2,3) (1,1)→(1,2)→(1,3)→(2,3)
- 路线 2 2 2: ( 1 , 1 ) → ( 1 , 2 ) → ( 2 , 2 ) → ( 2 , 3 ) (1,1) → (1,2) → (2,2) → (2,3) (1,1)→(1,2)→(2,2)→(2,3)
- 路线 3 3 3: ( 1 , 1 ) → ( 2 , 1 ) → ( 2 , 2 ) → ( 2 , 3 ) (1,1) → (2,1) → (2,2) → (2,3) (1,1)→(2,1)→(2,2)→(2,3)
时间限制:1 s
内存限制:64 MB
- 输入
输入只有一行,包括两个整数 m m m 和 n n n( 0 < m + n ≤ 20 0<m+n\le 20 0<m+n≤20),代表方格矩阵的行数和列数, m m m、 n n n 之间用空格隔开。 - 输出
输出只有一行,为不同的移动路线的数目。 - 样例输入
2 3
- 样例输出
3
思路分析
此题考查动态规划,属于基础题。
定义 f i , j f_{i,j} fi,j 表示从 ( 1 , 1 ) (1,1) (1,1) 走到 ( i , j ) (i,j) (i,j) 的方法数,不难得出状态转移方程为
f i , j = f i − 1 , j + f i , j − 1 f_{i,j} = f_{i-1,j} + f_{i,j-1} fi,j=fi−1,j+fi,j−1
初始值为 f i , 0 = f 0 , j = 1 f_{i,0} = f_{0,j} = 1 fi,0=f0,j=1,其中 1 ≤ i ≤ n 1 \le i \le n 1≤i≤n, 1 ≤ j ≤ m 1 \le j \le m 1≤j≤m,事实上,我们可以将 f 1 , 0 f_{1,0} f1,0 或 f 0 , 1 f_{0,1} f0,1 初始化为 1 1 1,然后从第一行第一列开始求解。最终 f n , m f_{n,m} fn,m 即为答案。
/** Name: T1.cpp* Problem: 移动路线* Author: Teacher Gao.* Date&Time: 2024/12/11 17:50*/#include <iostream>using namespace std;int main()
{ios::sync_with_stdio(false);cin.tie(0);int n, m, f[25][25] = {0};cin >> n >> m;f[1