1. 程式人生 > >第十一周 Leetcode 576. Out of Boundary Paths (HARD) 計數dp

第十一周 Leetcode 576. Out of Boundary Paths (HARD) 計數dp

位置 左右 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