- >マトリックス
説明:
N×n行列を入力し、行列の右列の動作の各サイクルの任意の回数、右後毎に、各列の最大値と行の計算された行列、これらの最小値の最大値を出力することができます。
サンプル入力
2 4 6 3 7 3 1 2 3 4 5 6 7 8 9 -1
サンプル出力
11 15
トピックリンク
https://vjudge.net/problem/POJ-2078
N ^ n個の可能な状態まで右の行列の後に、N×n行列のために、行サイクルをDFS溶液を用いて、7まで^ 7 = 823問題543の状態は、検索が激しいことができます。使用DFSは、これらの状態を検索し、行列の各状態の欄が計算され、最大値、最小値への出力の最大値。
ACコード
書式#include <iostreamの> の#include <cstdioを> する#include <fstreamの> の#include <アルゴリズム> 書式#include <cmath> の#include <両端キュー> の#include <ベクトル> の#include <キュー> の#include < 文字列 > の#include <CStringの> #include <地図> の#include <スタック> の#include < 設定 > の#include <sstream提供> の#define IOS ios_base :: sync_with_stdio(0)。cin.tie(0)。 長い長いLL の#define 0x3f3f3f3f INF の#define MEM(X、Y)のmemset(X、Y、はsizeof(X)) の#define MAXN 30 使って 名前空間STDを、 INT N-; int型MPが[MAXN] [MAXN]; int型; ANS 空隙 INIT(INT X)// 行MP [X] []右円 { int型 T MP = [X] [N- 1。]; のための(INT J = N- 1。 ; J> 0 ; J、 ) MP [X] [J] = MP [X] [J- 1 ]; MP [X] [ 0 ] = T。 } ボイド DFS(INT X) { IF(X == N-) { int型 maxSum = -INF; // カラムと最大値 のためには、(int型 I = 0、I <N - 、I ++は) { int型 SUM = 0 ; のために(INT J = 0 ; J <N-; J ++ ) SUM + = MP [J] [I]は、 maxSum = MAX(SUM、maxSum); } ANS =分(maxSum、ANS); // 保存列と最大値分 } 他 { について(int型 I = 0 ; Iは、N <; Iは++)// 各行を右にn回回転させた { INIT(X)、 (XのDFS + 1 ); } } } int型のmain() { 一方(CIN >> N-、N- =! - 1。 ) { MEM(MP、0 ); ANS = INF; のための(int型 I = 0を I <N-; I ++ ) のための(INT J = 0 ; J <N-; J ++) CIN >> MP [I]、[J]、 DFS(0); // 検索を開始 COUT ANS << << ; ENDL } 戻り 0 ; }