遞迴 棋盤分割問題

2021-06-22 00:38:38 字數 1408 閱讀 7696

language:

default

棋盤分割

time limit:1000ms

memory limit:10000k

total submissions:11819

accepted:4175

description

將乙個8*8的棋盤進行如下分割:將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的部分繼續如此分割,這樣割了(n-1)次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。(每次切割都只能沿著棋盤格仔的邊進行) 

原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要把棋盤按上述規則分割成n塊矩形棋盤,並使各矩形棋盤總分的均方差最小。 

均方差i為第i塊矩形棋盤的總分。 

請程式設計對給出的棋盤及n,求出o'的最小值。 

input

第1行為乙個整數n(1 < n < 15)。 

第2行至第9行每行為8個小於100的非負整數,表示棋盤上相應格仔的分值。每行相鄰兩數之間用乙個空格分隔。 

output

僅乙個數,為o'(四捨五入精確到小數點後三位)

基本思路:

矩形座標(x1,y1,x2,y2)   ,    t = min(  min(fun(n-1,x1,y1,i,y2) + fun(1,i+1,y1,x2,y2)), min(fun(n-1,i+1,y1,x2,y2) + fun(1,i+1,y1,x2,y2) , .....fun(對y分割)

因為會有重複計算 , 用res存貯特定 n和座標下得值

/*  棋盤分割  */

int s[9][9]; // 每個格仔的分數

int sum[9][9]; // (i,j)之前的分數和

int res[15][9][9][9][9]; // number , x1,y1,x2,y2 相應位置上和

int calsum(int x1,int y1,int x2,int y2)

int fun(int n, int x1,int y1,int x2,int y2)

if (n == 1)

for (a=x1;at)

}for (b=y1;bt)

}res[n][x1][y1][x2][y2] = min;

return min;

}int main()

} double result = n*fun(n,1,1,8,8) - sum[8][8] * sum[8][8];

cout<

coursera演算法初步 遞迴 棋盤分割問題

將乙個8 8的棋盤進行如下分割 將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的部分繼續如此分割,這樣割了 n 1 次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤.每次切割都只能沿著棋盤格仔的邊進行 注意粗體字 再將剩下的部分繼續切割 也就是說,被割出去的那一塊是不允許再被切割的。原棋盤上每一...

python遞迴法解決棋盤分割問題

再將剩下的棋盤繼續進行如上分割,這樣割 n 1 次,最後原棋盤被分割成n塊矩形棋盤 注意 每次分割只能沿著棋盤格仔的邊進行分割 原棋盤每個格仔都有乙個分值,乙個矩形棋盤的總分,為所含各格分值之和 其中,xi為第i塊矩形棋盤的總分 對給出的棋盤和n,使得矩形棋盤總分的均方差最小,並輸出 分析思路 程式...

遞迴,記憶化搜尋,(棋盤分割)

題目鏈結 problem 1191memory 568ktime 16mslanguage c result accepted 解題報告 1 公式可以利用數學方法化簡,就是求各個矩陣上的數 的和 的平方和最小。2 每一次分割都有四種情況 遞迴 3 每一次分割的位置要進行比較,從而找到最佳。inclu...