穿过街道
Problem:20
Time Limit:1000ms
Memory Limit:65536K
Description
一个城市的街道布局如下:从最左下方走到最右上方,每次只能往上或往右走,一共有多少种走法?
Input
输入很多行行数,每行1个数字代表n的值,当n=0时结束(2<=n<=15)
Output
输出对应每行n值的走法.
Sample Input
1 2 10 5 0
Sample Output
2 6 184756 252
dp入门题,当前这一点的方法就等于我来自于左面和下面的和。
记忆化搜索写法:
# include <iostream>
# include <cstring>
using namespace std;
const int maxn = 20;
int dp[maxn][maxn];
int dfs(int x, int y)
{
if(dp[x][y] != -1)
{
return dp[x][y];
}
int result;
if(x == 0|| y== 0)
{
return 1;
}
else
{
dp[x][y] = dfs(x - 1, y) + dfs(x, y - 1);
result = dp[x][y];
return result;
}
}
int main(int argc, char *argv[])
{
int n;
memset(dp, -1, sizeof(dp));
while(cin >> n, n)
{
cout << dfs(n, n) << endl;
}
return 0;
}
递推写法:
# include <iostream>
# include <cstring>
using namespace std;
const int maxn = 20;
int dp[maxn][maxn];
int main(int argc, char *argv[])
{
int n;
memset(dp, 0, sizeof(dp));
for(int i = 0; i < maxn; i++)
{
dp[i][0] = 1;
dp[0][i] = 1;
}
for(int i = 1; i < maxn; i++)
{
for(int j = 1; j < maxn; j++)
{
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
}
}
while(cin >> n, n)
{
cout << dp[n][n] << endl;
}
return 0;
}