标签:highlight set log ref blog 上下左右 .com mem 上下
Leetcode 576 给定一个二维平面, 一个球在初始位置(i,j)每次可以转移到上下左右的一格。 问在N次转移内,有多少种路径可以转移出边境。
dp[i][j][k]为 在点(i,j) 已经走了k步的累积路径数。 最后答案就是边境点且k<=N-1之和。 转移方程是显而易见的。
const int MOD=1000000007; class Solution { public: int dp[50][50][50]; int findPaths(int m, int n, int N, int i, int j) { memset(dp,0,sizeof(dp)); dp[i][j][0]=1; for(int k=0;k<N-1;k++) for(int i=0;i<m;i++) for(int j=0;j<n;j++) { if((i-1)>=0)dp[i-1][j][k+1]+=dp[i][j][k],dp[i-1][j][k+1]%=MOD; if((i+1)<m)dp[i+1][j][k+1]+=dp[i][j][k],dp[i+1][j][k+1]%=MOD; if((j-1)>=0)dp[i][j-1][k+1]+=dp[i][j][k],dp[i][j-1][k+1]%=MOD; if((j+1)<n)dp[i][j+1][k+1]+=dp[i][j][k],dp[i][j+1][k+1]%=MOD; } int ans=0; for(int i=0;i<m;i++) for(int j=0;j<n;j++) { int num=0; num+=(i-1)<0; num+=(j-1)<0; num+=(i+1)>=m; num+=(j+1)>=n; if(num>0) for(int k=0;k<=N-1;k++) for(int ii=0;ii<num;ii++) ans=(ans+dp[i][j][k])%MOD; } return ans%MOD; } };
第十一周 Leetcode 576. Out of Boundary Paths (HARD) 计数dp
标签:highlight set log ref blog 上下左右 .com mem 上下
原文地址:http://www.cnblogs.com/heisenberg-/p/6851907.html