POJ Bailian --1191チェス盤

 

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、1188) -和[ 8 ] [ 8 ] *和[ 8 ] [ 8 ]。
    COUT << setiosflags(IOS :: 固定)<<てSetPrecision(3)<< SQRT(結果/(N * N))<< ENDL。// 按照公式计算
    リターン 0 ; 
}

 

        革命が成功しなかった、同志はまだ動作します。

 

おすすめ

転載: www.cnblogs.com/zhienzhen/p/12294075.html