第十一周 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的主要内容,如果未能解决你的问题,请参考以下文章

576. Out of Boundary Paths

576. Out of Boundary Paths

每周总结(第十一周)

第十一周课程总结

第十一周学习进度

第十一周 继承与多态