码迷,mamicode.com
首页 > 其他好文 > 详细

第十一周 Leetcode 576. Out of Boundary Paths (HARD) 计数dp

时间:2017-05-14 12:20:18      阅读:108      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!