Description
丽萨参加了一个攀岩比赛,她想知道从起点到终点有多少种走法。
现在给你岩壁图,用1和0表示,其中1表示岩壁的那一处突出一块大石头,丽萨没办法从那里通过,0表示能够顺利爬过去。
丽萨只能往左爬或往上爬。
起点是在最右下角的岩壁旁的地面,丽萨只能从最右下角开始往岩壁上爬,终点是在最左上角的岩壁。
你现在需要写出一个程序统计出丽萨有多少种走法。
Input
第一行整数m和n,分别表示岩壁图的行数和列数,m和n的值均不超过100;
后面m行每行n个整数;
Output
一个整数,表示有多少种走法
Sample Input
3 5
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
Sample Output
6
1 #include<stdio.h>
2 int main(){
3 int m,n;
4 scanf("%d%d",&m,&n);
5 int a[103][103];
6 long long dp[103][103];//一定要用long long 用int不够
7 for(int i=1;i<=m;i++){
8 for(int j=1;j<=n;j++){
9 scanf("%d",&a[i][j]);
10 }
11 }
12 dp[m][n]=1;//终点到终点是一条路径
13 for(int i=m;i>=1;i--){
14 for(int j=n;j>=1;j--){
15 if(a[i][j]==1)//如果该点是障碍,
16 dp[i][j]=0;//那么该点到终点的路径数是0
17 else//如果不是障碍
18 dp[i][j]+=dp[i+1][j]+dp[i][j+1];//该点的路径数等于它下边的点的路径数加上它右边的点的路径数
19 }
20 }
21 printf("%lld",dp[1][1]);//输出起点到终点的路径数
22 return 0;
23 }
这道题用动态规划,用搜索会超时,主要的思路就是该点的路径数等于它下边的点的路径数加上它右边的点的路径数
另外动态规划的数据一般都很大,dp数组时常要用long long 来定义
另外说下为什么代码第18行要用+=,这个+=就是为了终点而设置的,因为终点一开始已经设置成1了,
终点的话,一开始肯定是加两个0,如果光用=的话,那么终点的dp数组的值就变成0了
除了终点外,都用=就行