第十一周 Leetcode 576. Out of Boundary Paths (HARD) 计数dp
Posted 逐雪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十一周 Leetcode 576. Out of Boundary Paths (HARD) 计数dp相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章