1191:チェス盤
- 合計時間制限:
- 1000ミリ秒
- メモリ制限:
- 65536kB
- 説明
-
次のように8×8のチェッカーボードは、分割される:元長方形の市松模様の部分を切断し、残りの部分は長方形の基板であり、次いで残りは、そう分割され続けるので、最終とともにカット(N-1)回残りの全N長方形のボードボックス矩形ボード。(各カットは、チェス盤の側面に沿って行うことができます)
各セルは、元のスコアを有する基板上に、各グリッド矩形ボードのスコアは、その合計スコアに含まれています。今、我々は、長方形の基板のn個のブロックに上記の規則によってチェスボードする必要があり、各矩形板の最小分散の外でした。
平均二乗誤差 、前記平均値 、i番目のブロックXI長方形の市松スコア。
ボード・プログラミングと最小値のnは、取得したO」を与えてください。 - エントリー
-
最初の整数n(1 <N <15)を行います 。
2、非負整数100を行うために8時間毎行目にライン9は、基板の対応するセルの値を表します。各隣接する行は、二つの数字の間のスペースで区切られました。 - 輸出
- (最も近い3つの小数点以下を四捨五入)Oの数だけ」。
- サンプル入力
-
3 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 3
- サンプル出力
- 1.633
- 最初の質問は、式を簡素化します。探している分散式は、この方法を簡素化することができます。
- 図からわかる、および最小分散分権部門や四角の最小値を求めるために。あなたは、動的プログラミングを使用することができます。
- 次のコードステッカーでAC
#include <iostreamの> する#include <地図> の#include < ストリング > の#include <cmath> の#include <iomanip> の#include <アルゴリズム> の#include <memory.h> 使用して 名前空間STD; INT DP [ 15 ] [ 15 ] [ 15 ] [ 15 ] [ 15 ]; // 動的プログラミング・アレイ、状態記録 のint M [ 10 ] [ 10 ]; int値 SUM [ 15 ] [ 15 ] = { 0 }; //(i、j)は、ボードの重量とSUM [I] [J]の左上隅(1,1)の値が int型合計= 0 ; int型N-; INT calsum(INT X1、INT Y1、INT X2を、INT Y2)// ボード重量および値の合計(X2、Y2)を(X1、Y1)から算出 { 戻り和[X2] [Y1 - - (SUM [X2] [Y2] 。1 ] - SUM [X1 - 。1 ] [Y2] + SUM [X1 - 1 ] [Y1 - 1。]); } int型(解決INT N-、INT X1、INT Y1、INT X2、INT Y2)を//再帰関数、Nは、集電部を何枚、X1、Y1、X2、Y2示す左上隅の現在の座標と右下の角板に分割されて表し { // 残りはに分割され、この関数が返すをn個のブロック(X1、Y1)内部(X2、Y2)nのブロックは、ボードチェッカーボードの正方形と最小分散分割さ INT T、B、C、E; INTミリアンペア= 1E7と、 INT&ANS DP = [N] [X1] [ Y1] [X2] [Y2]; // ANS変化は、対応する値もDP変更された場合注、参照形態によって本明細書ANS IF - (ANS =!1。 )// ANS DPが記録された非負の値を表し、直接であってもよいです参照、時間を節約 { 戻りANS; } IF(N - == 1)// N-1 =境界条件に到達するまでの時間 { T = calsum(X1、Y1、X2、Y2); ANS = T * T。 リターン; ANS } ための(A = X1; A <X2; A ++)// x方向に分割 { C = calsum(A + 1 、Y1、X2、Y2); E = calsum(X1、Y1、A、Y2 ); T =分(C + C *(N--解決1 *解決E + E、X1、Y1、A、Y2)(N - 1、A + 1、Y1、X2、Y2)); // から左側及び右側それぞれ次の最小値が選択されたセグメンテーションを行う IF(ミリアンペア> T) { ミリアンペア = T; } } のために(B = Y1; B <Y2、B ++)// の上方が、Y方向から今回セグメンテーション { C = calsum(X1、B + 1 、X2、Y2)。 E = calsum(X1、Y1、X2、B)。 T =分(C * C +解く(N - 1、X1、Y1、X2、B)、E * E +解く(N - 1、X 1、B + 1 、X2、Y2))。 もし(MA> T) { MA = T。 } } ANS = MA。 リターンミリアンペア。 } int型のmain() { memsetの(DP、 - 1、はsizeof(DP))。// 一开始全部赋成-1 CIN >> N-; のための(INT I = 1 ; I <= 8 ; I ++ ) { 合計 = 0 ; // 各行の合計チェッカーボード重量を記録 するための(INT J = 1。 ; J <= 8 ; J ++ ) { CIN >> M [I]、[J]; 合計 + = M [I]、[J]; SUM [I] [J] + = SUM [I - 1 ] [J] + 合計; } } ダブル = N-の結果は*解決(N、1、1、8、8) -和[ 8 ] [ 8 ] *和[ 8 ] [ 8 ]。 COUT << setiosflags(IOS :: 固定)<<てSetPrecision(3)<< SQRT(結果/(N * N))<< ENDL。// 按照公式计算 リターン 0 ; }
- 革命が成功しなかった、同志はまだ動作します。