一、题目链接
二、题目分析
(一)算法标签
动态规划
(二)解题思路
三、AC代码
解法一:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 35;
int n, m;
// f[i][j] 表示从(1,1)走到(i,j)的方案数
int f[N][N];
int main()
{
cin >> n >> m;
// 初始化, 第一行和第一列的方案数都为1
for (int i = 1; i <= n; i ++ ) f[i][1] = 1;
for (int i = 1; i <= m; i ++ ) f[1][i] = 1;
for (int i = 2; i <= n; i ++ )
for (int j = 2; j <= m; j ++ )
if (i & 1 || j & 1) // i,j其中有一个为奇数
f[i][j] = f[i - 1][j] + f[i][j - 1];
cout << f[n][m] << endl;
return 0;
}
dfs(时间复杂度: O ( 2 m + n ) O(2^{m+n}) O(2m+n),TLE)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 35;
int n, m;
int ans;
void dfs(int x, int y)
{
if (x > n || y > m) return;
if (x % 2 == 0 && y % 2 == 0) return;
if (x == n && y == m)
{
ans ++ ;
return;
}
dfs(x + 1, y);
dfs(x, y + 1);
}
int main()
{
cin >> n >> m;
dfs(1, 1);
cout << ans << endl;
return 0;
}