题目一个机器人,从左上角走到右下角,问共有几种路径?
解法一:递归
int findpath(int i, int j, int n)
{
if (i==n == 1 && j==n== 1)
return 1;
if (i == n || j == n)
return 1;
if (i > n || j > n)
return 0;
return findpath(i + 1, j, n) + findpath(i, j + 1, n);
}
解法二:记忆递归
long int mfindpath(int i, int j, int n)
{
if (b[i][j] != -1)
return b[i][j];
if (i == n == 1 && j == n == 1)
{
b[i][j] = 1;
return b[i][j];
}
if (i == n || j == n)
return 1;
if (i > n || j > n)
return 0;
b[i][j] = mfindpath(i + 1, j, n) + mfindpath(i, j + 1, n);
return b[i][j];
}
解决三:dp
int dp(int n)
{
b[n][n] = 1;
for (int i = 1; i <= n - 1; i++)
{
b[n][i] = 1;
b[i][n] = 1;
}
for (int i = n - 1; i >= 1; i--)
for (int j = n - 1; j >= 1; j--)
b[i][j] = b[i + 1][j] + b[i][j + 1];
return b[1][1];
}
完整代码:
#include<iostream>
#include<Windows.h>
using namespace std;
#define max 1000
int a[max][max];
long int b[max][max];
int findpath(int i, int j, int n)
{
if (i==n == 1 && j==n== 1)
return 1;
if (i == n || j == n)
return 1;
if (i > n || j > n)
return 0;
return findpath(i + 1, j, n) + findpath(i, j + 1, n);
}
long int mfindpath(int i, int j, int n)
{
if (b[i][j] != -1)
return b[i][j];
if (i == n == 1 && j == n == 1)
{
b[i][j] = 1;
return b[i][j];
}
if (i == n || j == n)
return 1;
if (i > n || j > n)
return 0;
b[i][j] = mfindpath(i + 1, j, n) + mfindpath(i, j + 1, n);
return b[i][j];
}
int dp(int n)
{
b[n][n] = 1;
for (int i = 1; i <= n - 1; i++)
{
b[n][i] = 1;
b[i][n] = 1;
}
for (int i = n - 1; i >= 1; i--)
for (int j = n - 1; j >= 1; j--)
b[i][j] = b[i + 1][j] + b[i][j + 1];
return b[1][1];
}
void main()
{
DWORD start_time = GetTickCount();
for (int n = 1; n <= 100; n++)
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
b[i][j] = -1;
cout << "n=" << n << " : " << mfindpath(1, 1, n) << endl;
}
DWORD end_time = GetTickCount();
cout << "The run time is:" << (end_time - start_time) << "ms!" << endl;
cout << "--------------" << endl;
start_time = GetTickCount();
for (int n = 1; n <= 100; n++)
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
b[i][j] = -1;
cout << "n=" << n << " : " << dp(n) << endl;
}
end_time = GetTickCount();
cout << "The run time is:" << (end_time - start_time) << "ms!" << endl;
system("pause");
}