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...