LeetCode576. 出界的路徑數-三維數組動態規劃+dfs

1、對於邊界個數,二維矩陣到某個位置的次數等問題,首要考慮dfs
2、本題有三個變數:i,j,N三個都要用作dp變量
在規定的步數內走到邊界,可以用遞歸。但是直接遞歸會造成超時
在遞歸的過程中總會走到一些之前已經走過的地方,記錄每次走的地方的值,直接返回
因爲有步數的限制,所以數組需要使用三維數組(創新點)
注意是走N+1步出界算作是結束條件,所以開闢數組的時候要開闢N+1

代碼:

package com.leetCode.dp;

public class leet576 {
	/**
	 * 在規定的步數內走到邊界,可以用遞歸。但是直接遞歸會造成超時
	 * 在遞歸的過程中總會走到一些之前已經走過的地方,記錄每次走的地方的值,直接返回
	 * 因爲有步數的限制,所以數組需要使用三維數組(創新點)
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(findPaths(2,2,2,0,0));
	}
    public static int findPaths(int m, int n, int N, int i, int j) {
    	int ans=0;
    	int[][][] dp = new int[m][n][N+1];
    	for(int a=0;a<m;a++)
    		for(int b=0;b<n;b++)
    			for(int c=0;c<=N;c++)
    				dp[a][b][c]=-1;
    	ans=find(m,n,N,i,j,dp);
    	return ans;
    }
	private static int find(int m, int n, int N, int i, int j, int[][][] dp) {
		if(N<0) return 0;//當步數用完了還沒有到達邊界,返回0
		if(i<0||j<0||i==m||j==n) return 1;//到達邊界
		if(dp[i][j][N]==-1)
		{
			dp[i][j][N]=0;
			dp[i][j][N]+=find(m,n,N-1,i-1,j,dp);
			dp[i][j][N]%=1000000007;
			dp[i][j][N]+=find(m,n,N-1,i+1,j,dp);
			dp[i][j][N]%=1000000007;
			dp[i][j][N]+=find(m,n,N-1,i,j-1,dp);
			dp[i][j][N]%=1000000007;
			dp[i][j][N]+=find(m,n,N-1,i,j+1,dp);
			dp[i][j][N]%=1000000007;
		}
		return dp[i][j][N];
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章