题目大意:每一小格代表能向右或者向下走几步,问从左上走到右下总共有多少种走法。
dp[i][j]存放该格子有多少总走法。
#include <iostream> #include <cstring> using namespace std; int n; char a[40][40]; int s[40][40]; __int64 dp[40][40]; int X[]={1, 0}; int Y[]={0, 1}; __int64 dfs(int x, int y) { if(dp[x][y] || !s[x][y]) return dp[x][y]; int xx, yy; for(int i=0; i<2; i++) { xx=x+X[i]*s[x][y]; yy=y+Y[i]*s[x][y]; if(xx>=0 && xx<n && yy>=0 && yy<n) dp[x][y]+=dfs(xx,yy); } return dp[x][y]; } int main() { while(cin>>n && n!=-1) { for(int i=0; i<n; i++) cin>>a[i]; for(int i=0; i<n; i++) for(int j=0; j<n; j++) s[i][j]=a[i][j]-'0'; memset(dp, 0, sizeof(dp)); dp[n-1][n-1]=1; cout<<dfs(0,0)<<endl; } return 0; }
HDU 1208 Pascal's Travels( 记忆化搜索)
原文地址:http://blog.csdn.net/wangxinxin_/article/details/45600541