タイトルの意味:タイトルあなたが(W、H)と(1,1)から黒四角の最小数を取得する必要があり、あなたの行列を与えることです
ソリューション:私はもともと考えとして、この質問は、DFSは、すべての可能な方法を見つけることだった、彼らはTLEの結果、最小を比較し、試合後に質問を行い、DPも行うために使用することができます理解してください。ここでは、DPは、[I] [j]が代表点に到達した二次元配列DP [H] [W]を、規定(i、j)の場合も反転または必要性を表す黒ブロック、ブロックの最小数(サブジェクト説明黒ブロックは、その最小のそれぞれを決定するために、)白色ブロックを反転します。
TLEコードは以下のとおりであります:
書式#include <iostreamの> の#include <CStringの> の#include <アルゴリズム> に#define LL長い長い 使って 名前空間はstdを、 int型 min_n = 100 * 100 + 5 。 int型の合計= 0 ; // 存储临时答案 INT H、W。 チャー PTR [ 150 ] [ 150 ]。 int型のネット[ 2 ] [ 2 ] = {{ 0、1 }、{ 1、0 }}。 ブールチェック(int型X、INT Y){ リターン(X <= H / * 行* /)&&(Y <= W / * 列* /); // 分析正当 } ボイド DFS(int型 X、INT Y){ // すべてのトラバーサル、最小オペランド見つける IF(X == Y == H && W){ // これはの終わりに達する ; min_n =分(min_n、SUM)を//は最小除去 リターン ; //は、コール終了 } // 検索を次のステップ のために(INT I = 0 ; I < 2 ; I ++ ){ int型NET = X + NX [I] [ 0 ]; int型 NY NET = Y + [I] [ 1 ]; // 検索次の操作 // 次の動作が正当であると判断 IF(チェック(NX、NY)){ / / もし法的 IF(PTR [NX] [NY] == ' #'){ //の位置が黒または白、黒プラス操作であると判定された SUM ++ ; } DFS(NX、NY); IF(PTR [ NX] [NY] == ' #' ){ SUM - ; } } } } int型のmain(){ CINH >> W; のための(INT I = 1 ; I <= H; I ++ ){ ため(INT J = 1。 ; J <= W; J ++ ){ CIN >> PTR [I]、[J]; } } // データ入力が完了すると、以下が開始される処理 // 決意に、まず、第1ない IF(PTR [ 1 ] [ 1。 ==] ' #' ){ SUM ++; // 動作インクリメントカウンタ } DFSを(1。、1); //はその後、検索開始からトラバース coutの<< min_n << てendl; リターン 0 ; }
ここではACコードは次のとおりです。
書式#include <iostreamの> の#include <CStringの> の#include <アルゴリズム> に#define LL長い長い 使って 名前空間はstdを、 int型 min_n = 100 * 100 + 5 。 int型の合計= 0 ; // 存储临时答案 INT H、W。 チャー PTR [ 150 ] [ 150 ]。 int型のネット[ 2 ] [ 2 ] = {{ 0、1 }、{ 1、0 }}。 ブールチェック(int型X、INT Y){ リターン(X <= H / * 行* /)&&(Y <= W / * 列* /); // 分析正当 } ボイド DFS(int型 X、INT Y){ // すべてのトラバーサル、最小オペランド見つける IF(X == Y == H && W){ // これはの終わりに達する ; min_n =分(min_n、SUM)を//は最小除去 リターン ; //は、コール終了 } // 検索を次のステップ のために(INT I = 0 ; I < 2 ; I ++ ){ int型NET = X + NX [I] [ 0 ]; int型 NY NET = Y + [I] [ 1 ]; // 検索次の操作 // 次の動作が正当であると判断 IF(チェック(NX、NY)){ / / もし法的 IF(PTR [NX] [NY] == ' #'){ //の位置が黒または白、黒プラス操作であると判定された SUM ++ ; } DFS(NX、NY); IF(PTR [ NX] [NY] == ' #' ){ SUM - ; } } } } int型のmain(){ CINH >> W; のための(INT I = 1 ; I <= H; I ++ ){ ため(INT J = 1。 ; J <= W; J ++ ){ CIN >> PTR [I]、[J]; } } // データ入力が完了すると、以下が開始される処理 // 決意に、まず、第1ない IF(PTR [ 1 ] [ 1。 ==] ' #' ){ SUM ++; // 動作インクリメントカウンタ } DFSを(1。、1); //はその後、検索開始からトラバース coutの<< min_n << てendl; リターン 0 ; }