题目:「木」迷雾森林
Description
帕秋莉掌握了一种木属性魔法。
这种魔法可以生成一片森林(类似于迷阵),但一次实验时,帕秋莉不小心将自己困入了森林。帕秋莉处于地图的左下角,出口在地图右上角,她只能够向上或者向右行走。现在给你森林的地图,保证可以到达出口,请问有多少种不同的方案。答案对2333取模!
Input
第一行两个整数m , n表示森林是m行n列
接下来m行,每行n个数,描述了地图
0 - 空地
1 - 树(无法通过)
Output
一个整数表示答案
Sample
输入
3 3
0 1 0
0 0 0
0 0 0
输出
3
Solution
原问题:从左下角走到右上角的方案数。
子问题:从(1,1)到(x,y)的方案数。令左下角为(1,1)。
状态:dp[i][j]表示从(1,1)到(i,j)的方案数
状态转移方程:dp[i][j]=dp[i-1][j]+dp[i][j-1]。因为只能够向上或者向右行走!
AC Code
#include<bits/stdc++.h>
using namespace std;
int f[3010][3010];
int dp[3010][3010];
int mod=2333;
template<class T>inline void read(T &res)
{
char c;T flag=1;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
int main(){
int m,n;
read(m);
read(n);
for(int i=m;i>=1;i--){
for(int j=1;j<=n;j++){
read(f[i][j]);
}
}
dp[1][1]=1;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(f[i][j]==0&&dp[i][j]==0) dp[i][j]=(dp[i-1][j]+dp[i][j-1])%mod;
}
}
cout<<dp[m][n]<<endl;
return 0;
}