1. 程式人生 > >動態規劃求解國際象棋中車點到點的最短路徑總數

動態規劃求解國際象棋中車點到點的最短路徑總數

題目:國際象棋中的車可以水平或豎直移動。一個車從棋盤的一角(0,0)移動到另一角(n,n),有多少種最短路徑。

分析:對於n*n的棋盤,從(0,0)移動到(n,n)的最短路徑總數應該為C(2n, n), 因為必走2n步,其中n步向左,剩下為向右。

public class ShortestStepsInChess {

	// from (0,0) to (n,n)
	// count[i,j] = count[i-1,j] + count[i,j-1]
	public static int cal(int n) {
		int[][] count = new int[n + 1][n + 1];
		for (int i = 0; i <= n; i++) {
			count[0][i] = 1;	// (0,0) walk to (0,i) use i steps, just 1 solution
			count[i][0] = 1;	// (0,0) walk to (i,0) use i steps, just 1 solution
		}
		
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++) {
				count[i][j] = count[i - 1][j] + count[i][j - 1];
				assert count[i][j] == SetUtils.combination(i + j, i);
			}
		return count[n][n];
	}
	
	public static void main(String[] args) {
		System.out.println(cal(4));
	}
	
}


相關推薦

動態規劃求解國際象棋中車點到點的路徑總數

題目:國際象棋中的車可以水平或豎直移動。一個車從棋盤的一角(0,0)移動到另一角(n,n),有多少種最短路徑。 分析:對於n*n的棋盤,從(0,0)移動到(n,n)的最短路徑總數應該為C(2n, n), 因為必走2n步,其中n步向左,剩下為向右。 public clas

動態規劃(演算法+理論) ★路徑

首先介紹動態規劃的概念: ①問題是由交疊的自問題構成的,是對給定問題求解的遞推關係中的相同型別的*更小子問題的解*dp+回溯 ②從頂至下,避免計算不需要計算的小解(記憶) ③求解最優化問題可以用動態規劃 動態規劃下筆寫程式碼前先去頂遞推式 直接看例項:

動態規劃求解較小規模的大團問題(Python實現)

1.圖:由點、邊(點與點之間連線),組成的集合,如點集V=[0,1,2,3,4],邊集E=[[1,3,4],[2,3,4],[4],[4],[]],則(V,E)就是一個圖,其表達的意思如下: 該圖中含有5個端點,分別為0,1,2,3,4,這些點存在V中,如端點1對應V

動態規劃求解矩陣累計和大的路徑

/** * 有一個 M x N 的矩陣,其中每個格子裡面都有特定的錢。 * 左上角走到右下角,只能向右或者向下走,問怎麼走才能撿到最多的錢。 * 輸出撿錢的路徑。 * 解析: 動態規劃。 首先找到子結

關於棧與遞迴求解迷宮與迷宮路徑問題

一、棧實現迷宮問題: 問題描述:用一個二維陣列模擬迷宮,其中1為牆,0為通路,用棧方法判斷迷宮是否有出口,下圖為簡單模擬的迷宮: 思想: 1.首先給出入口點,如上圖入口點座標為{2,0}; 2.從入口點出發,在其上下左右四個方向試探,若為通路(值為0)時,則向前走,並將每

動態規劃 LeetCode 120.三角形的路徑

題目描述 給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。 例如,給定三角形 [ [2], [3,4], [6,5,7], [4,1

佇列應用2:求解迷宮問題,路徑

package Queue; //迷宮 class Map { // 迷宮陣列,外圍加一道圍牆,防止陣列越界出現異常 public static int mg[][] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1,

[Qt][Floyd演算法] 動態規劃求解行駛路徑 原始碼及演示程式

首先給出程式下載連結: [問題描述] 給定一個的矩形網格,設其左上角為起點S。一輛汽車從起點S出發駛向右下角終點T。網格邊上的數字表示距離。在若干網格點處設定了障礙,表示該網格點不可到達。試設計一個

圖論動態規劃演算法——Floyd路徑

前言 推出一個新系列,《看圖輕鬆理解資料結構和演算法》,主要使用圖片來描述常見的資料結構和演算法,輕鬆閱讀並理解掌握。本系列包括各種堆、各種佇列、各種列表、各種樹、各種圖、各種排序等等幾十篇的樣子。 Floyd演算法 Floyd是一種經典的多源最短路徑演算法,它通過動態規劃的思想來尋找給定加權圖中的多源

64. Minimum Path Sum路徑——動態規劃

這類問題的解決思路往往都是動態規劃 參考 https://blog.csdn.net/u014615155/article/details/77941488 對於網格中的元素grid[i][j],從最上角的元素grid[0][0]走到它的最短距離為: grid[i][j]=min(gri

動態規劃實現路徑問題

1 #include <iostream> 2 #include<fstream> 3 #include<sstream> 4 #include<vector> 5 #include<string> 6 using na

C++ 動態規劃 01揹包+ 大字陣列和 +路徑 +斐波那契數列

int max(int a,int b) { return a>b?a:b; } /* 0 1 揹包 */ int MaxValue() { int Weight[5]={2,2,6,5,4};//物品的重量陣列 int Value

動態規劃求解(添+號求小值和問題)

案例提出:在一個n位整數a(只考慮正整數的情況)中插入r個加號,將它分成r+1個整數,找出一種加號的插入方法,使得這r+1個整數的和最小。 動態規劃設計要點:對於一般插入r個+號問題,採用列舉不適合。注意到插入r個+號是一個多階層決策問題,所以採用動態規劃 來求解是最適宜的

動態規劃求解長上升子序列問題

// ch12.cpp: 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include "iostream" #include "vector" using namespace std; int main() { //輸入資料 int N

動態規劃求解長公共子序列的C++演算法實現

#include<iostream> using namespace std; int CommonOrder(char x[] ,int m ,char y[], int n, char z[]) {     int i,j,k;     int L[10][1

證明求路徑問題具有優子結構(動態規劃

演算法導論218頁說了很多來說明最長路徑問題不能用動態規劃演算法,最短路徑可以。在證明最短路徑子問題無關時候應該是預設承認了最短路徑的最優子結構的。可是證明最優子結構需要用到複製貼上法,在用複製貼上法的時候又不免會因為子問題不是無關的從而不能複製貼上,所以不能證明最優子結構,

演算法學習——動態規劃 例題:矩陣路徑(java)

給定一個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置, 路徑上所有的數字累加起來就是路徑的和,返回所有的路徑中的最小的路徑的和。 如果給定的m如大家看到的樣子,路徑1,3,1,0,6,1,0是所有路徑中路徑和最小的,所以返回12. 1 3 5 9 8 1 3 4 5 0 6 1

路徑動態規劃和貪心演算法

一言以蔽之:動態規劃,從全域性最優考慮;最短路徑,從當前最優考慮。 先考慮下面的圖 可以很容易地看出,如果使用貪心演算法,從a到e的路線將是:a->b->c->d->e,而採用動態的規劃的路線則是:a->c->e。 貪心演算法的優點是程

城市交通網(動態規劃路徑,輸出路徑

【例9.5】城市交通路網 時間限制: 1000 ms         記憶體限制: 65536 KB  【題目描述】 下圖表示城市之間的交通路網,線段上的數字表示費用,單向通行由A->E。試用動態規劃的最優化原理求出A->E的最省費用。 如圖:求v1到v1

路徑問題 動態規劃

    問題參考:           現有一張地圖,各結點代表城市,兩結點間連線代表道路,線上數字表示城市間的距離。如圖1所示,試找出從結點A到結點E的最短距離。 我們可以用深度優先搜尋法來解決此問題,該問題的遞迴式為 其中是與v相鄰的節點的集合,w(v,u)