给一个边长为n的矩阵,从左上角开始,只能向下或向右走,一共有几种走法。
思路:想要到达某一点,那么这一点的走法一定是其上面的点和左面的点的走法之和。
dp的状态转移方程为: dp[ i ][ j ]=dp[ i-1 ][ j ]+dp[ i ][ j-1 ]
代码:
#include<iostream>
#include<string>
using namespace std;
int **dp;
void solve(int n);
int main() {
int n;
cin >> n;
dp = new int*[n+1];
for (int i = 1; i <= n; i++) { /*创建动态二维数组*/
dp[i] = new int[n];
memset(dp[i], 0, sizeof(int) * (n+1)); /*将数组全部初始为0*/
}
for (int i = 1; i <= n; i++) { /*第一行和第一列初始化为1*/
if (n > 1) {
dp[1][i] = 1;
dp[i][1] = 1;
}
}
solve(n);
cout << dp[n][n];
}
void solve(int n) {
for (int i = 2; i <= n; i++) {
for (int j = 2; j <= n; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; /*计算每个点的走法并储存*/
}
}
}
此代码相比于递归会大大节省运算时间,需要数据可以直接从数组中提取,而不需要重复计算。