RobatWalk
/** * * @param n 总共N个位置 1~n * @param index 从index位置开始 * @param k 走k步 * @param p 目标 * @return 从index位置开始走k步到达p的方法数 */ public static int getWalkWays(int n,int index,int k,int p){ if(n<2||index<1||index>n||k<1||p<1||p>n){ return 0; } return process(n,index,p,k); } /** *从s位置开始走k步到达p的方法数 *固定参数:n,p *可变参数:cur,rest * @param n 总共N个位置 1~n * @param cur 当前位置--》 * @param p 到达P位置 * @param rest 还剩rest步--》 * @return */ public static int process(int n,int cur,int p,int rest){ //base case 没有步可以走了,那你是否在p位置呢,如在则返回1,表示之前做的选择有效 if(rest==0){ return cur==p?1:0; } //开始尝试,在位置1只能往2走 if(cur==1){ return process(n,2,p,rest-1);; } //在位置n,只能往n-1走 if(cur==n){ return process(n,n-1,p,rest-1); } //可以往前往后走 return process(n,cur-1,p,rest-1)+process(n,cur+1,p,rest-1);; }
缓存优化
public static int getWalkWays2(int n,int index,int k,int p){ if(n<2||index<1||index>n||k<1||p<1||p>n){ return 0; } HashMap<String,Integer> mapCach=new HashMap<>(); return process(n,index,p,k,mapCach); } /** *从s位置开始走k步到达p的方法数 *固定参数:n,p *可变参数:cur,rest * @param n 总共N个位置 1~n * @param cur 当前位置--》 * @param p 到达P位置 * @param rest 还剩rest步--》 * @return */ public static int process(int n,int cur,int p,int rest,HashMap<String,Integer> mapCache){ String key=cur+"_"+rest; if(mapCache.containsKey(key)){ return mapCache.get(key); } Integer ans; //base case 没有步可以走了,那你是否在p位置呢,如在则返回1,表示之前做的选择有效 if(rest==0){ ans=cur==p?1:0; mapCache.put(key,ans); return ans; } //开始尝试,在位置1只能往2走 if(cur==1){ ans=process(n,2,p,rest-1,mapCache); mapCache.put(key,ans); return ans; } //在位置n,只能往n-1走 if(cur==n){ ans=process(n,n-1,p,rest-1,mapCache); mapCache.put(key,ans); return ans; } //可以往前往后走 ans=process(n,cur-1,p,rest-1,mapCache)+process(n,cur+1,p,rest-1,mapCache); mapCache.put(key,ans); return ans; }
缓存优化2
public static int getWalkWays3(int n,int index,int step,int p) { if (n < 2 || index < 1 || index > n || step < 1 || p < 1 || p > n) { return 0; } //cur: 1~n,rest int[][] dp = new int[n + 1][step + 1]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= step; j++) { dp[i][j] = -1; } } return process(n, index, p, step, dp); } public static int process(int n,int cur,int p,int rest,int[][] dp){ if(dp[cur][rest]!=-1){ return dp[cur][rest]; } Integer ans; //base case 没有步可以走了,那你是否在p位置呢,如在则返回1,表示之前做的选择有效 if(rest==0){ ans=cur==p?1:0; dp[cur][rest]=ans; return ans; } //开始尝试,在位置1只能往2走 if(cur==1){ ans=process(n,2,p,rest-1,dp); dp[cur][rest]=ans; return ans; } //在位置n,只能往n-1走 if(cur==n){ ans=process(n,n-1,p,rest-1,dp); dp[cur][rest]=ans; return ans; } //可以往前往后走 ans=process(n,cur-1,p,rest-1,dp)+process(n,cur+1,p,rest-1,dp); dp[cur][rest]=ans; return ans; }
动态规划
public static int process2dp(int n,int start,int end,int step){ if(n<2|| step<1 || start<1||start>n||end<1||end>n){ return 0; } //cur 1--n rest 1--rest int[][] dp=new int[n+1][step+1]; dp[end][0]=1; for(int j=1;j<=step;j++){ dp[1][j]=dp[2][j-1]; dp[n][j]=dp[n-1][j-1]; for(int i=2;i<=n-1;i++) { dp[i][j] = dp[i - 1][j - 1] + dp[i + 1][j - 1]; } } return dp[start][step]; }