DFS与DP两种实现方式
求路径
http://www.nowcoder.com/questionTerminal/166eaff8439d4cd898e3ba933fbc6358
1.DP方法:
dp[i][j] = dp[i-1][j]+dp[i][j-1]
压缩空间表示
dp[i]= dp[i-1]+dp[i]
初始化dp[0~n]=1; 因为当m=1时所有路径为1。
public int uniquePaths (int m, int n) { // write code he int[] dp = new int[n]; for(int i=0;i<n;i++) dp[i]=1; for(int i=1;i<m;i++){ for(int j=1;j<n;j++){ dp[j] = dp[j-1]+dp[j]; } } return dp[n-1]; } }
2.记忆化+DFS:
import java.util.*; public class Solution { /** * * @param m int整型 * @param n int整型 * @return int整型 */ public int res =0; public HashMap<Integer,HashMap<Integer,Integer>> map; public int uniquePaths (int m, int n) { // write code he boolean[][] vis = new boolean[m][n]; this.map = new HashMap(); vis[0][0] = true; DFS(0,0,m,n,vis); return res; } public int DFS(int x, int y,int m,int n,boolean[][] vis){ int[][] dis = {{1,0},{0,1}}; int cnt=0; if(x==m-1&&y==n-1){ res++; return 1; } if(x>=m||x<0||y>=n||y<0) return 0; if(map.containsKey(x)&& map.get(x).containsKey(y)){ cnt= map.get(x).get(y); res+=cnt; return cnt; } for(int i=0;i<2;i++){ int xx= x+dis[i][0]; int yy = y+dis[i][1]; if(xx>=0&&xx<m&&yy>=0&&yy<n&&vis[xx][yy]==false){ vis[xx][yy] = true; cnt+=DFS(xx,yy,m,n,vis); vis[xx][yy] = false; } } if(!map.containsKey(x)) map.put(x,new HashMap()); this.map.get(x).put(y,cnt); return cnt; } }