第十一周 Leetcode 576. Out of Boundary Paths (HARD) 計數dp
阿新 • • 發佈:2017-05-14
位置 左右 for .com find tps https con light
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