分治法實例
1.基本思想
(1)分解:將要求解的問題用若干較小的同類子問題
(2)求解:當問題被劃分得足夠小的時候,用簡單方法解決
(3)合併:根據求解的問題,將子問題的接解逐層合併得到原問題的最終解
2.實例
視頻教程
上圖有個小錯誤,選手二的第5天爲5
import org.junit.Test;
public class Math {
@Test
public void Test() {
Solution solution = new Solution(4);
solution.GameMap(1,4);
for(int i=1;i<solution.a.length;i++)
{
for(int j=0;j<solution.a[i].length;j++)
System.out.print(solution.a[i][j]+" ");
System.out.println();
}
}
}
//分治法兵乓球賽制表講解
class Solution {
int a[][];
public Solution(int N)
{
this.a = new int[N+1][N];
}
//從第K號選手開始的n個選手(包括k)
void GameMap(int k,int n)
{
//等於2時表示在表的最左端
if(n==2)
{
this.a[k][1] = k+1;
this.a[k][0]=k;
this.a[k+1][0]=k+1;
this.a[k+1][1]=k;
}
else
{
GameMap(k,n/2);
GameMap(k+n/2,n/2);
//填充右下角
for(int i=k;i<=k+n/2-1;i++)
{
for(int j=0;j<=n/2-1;j++)
{
this.a[i+n/2][j+n/2] = a[i][j];
}
}
//填充右上角
for(int i=k+n/2;i<=k+n-1;i++)
{
for(int j=0;j<=n/2-1;j++)
{
this.a[i-n/2][j+n/2] = a[i][j];
}
}
}
}
}
上述代碼運行結果如下: