题目
帕秋莉处于地图的左下角,出口在地图右上角,她只能够向上或者向右行走。
现在给出森林的地图,保证可以到达出口,请问有多少种不同的方案。答案对2333取模。
0 - 空地
1 - 树(无法通过)
保证出发点和终点都是空地。
解题思路
使用动态规划思想。
地图左下角的坐标为 (m-1,0),右上角的坐标为 (0,n-1)。dp[i][j] 表示从左下角到达坐标 (i,j) 的方案数目,dp[m-1][0] = 1。状态转移方程为
如果坐标 (i,j) 是树,dp[i][j] = 0;
如果坐标 (i,j) 是空地,dp[i][j] = dp[i+1][j] + dp[i][j-1]。
最终 dp[0][n-1] 即为所求。
C++代码
#include<cstdio>
#include<vector>
using namespace std;
const int mod = 2333;
int main(){
int m, n;
scanf("%d%d", &m, &n);
vector<vector<char>> ground(m, vector<char>(n));
char c = getchar();
int i = 0;
int j = 0;
while(1){
if(c=='0' || c=='1'){
ground[i][j] = c;
++j;
if(j==n){
++i;
j = 0;
}
}
if(i==m)
break;
c = getchar();
}
vector<vector<int>> dp(m, vector<int>(n,0));
dp[m-1][0] = 1;
for(int i=m-1; i>=0; --i){
for(int j=0; j<n; ++j){
if(ground[i][j]=='0'){
if(i<m-1)
dp[i][j] = dp[i+1][j];
if(j>0)
dp[i][j] += dp[i][j-1];
}
dp[i][j] %= mod;
}
}
printf("%d\n", dp[0][n-1]);
return 0;
}
京公网安备 11010502036488号