羅区P1854問題へのフラワーショップのウィンドウディスプレイソリューション
分析
* V F行列を考えます
最初のF行目から旅行に必要な、各列は、番号が除去され、
列と取るべき行の数の数が多数の線に沿ったであろう、それは最大を求めて除去することができます
除去された各列の数字は行の列の数よりも大きくなければならないことに注意してくださいは、行番号、等です
彼らは花の花瓶の前に十分に残しておく必要がありますので、
同様に、各ラインは最大数は以下で花瓶V-(トレッキングのF-数)でなければならないと仮定することができます
したがって、我々は簡単に状態遷移方程式を描くことができます
DP [I] [J] = MAX(DP [I-1] [K])+ D [i]は[J](K <J)のD P [ I ] [ J ] = M A X (DのP [ I - 1 ] [ K ] )+ D [ I ] 、[ J ] (K < J )
DP [I] [J] D P [ I ] [ jは]まで移動する最初から取得し、第i行の第j行番号を削除することができる最大値を示し
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <アルゴリズム> 5の#include <積層体> 6の#define INT長い長い 7の#define MAXN 100 + 10 8の#define INF 9223372036854775807 9を用いて名前空間ははstd; 10インラインintはREAD() 11 { 12 INT X = 0。 13ブールF = 1。 14チャーC = GETCHAR()。 15(;!のisdigit(C); C = GETCHAR())IF(C == ' - ')、F = 0。 (; isdigit(C); C = GETCHAR())x =(x << 3)+(X << 1)+ C-'0' ; 16 17 IF(f)に戻り、X。 18リターン0-X。 19} 20インラインボイド書き込み(INT X) 21 { 22 IF(X <0){のputchar( ' - '); X = -x。 25} 26 int型のF、V。 27 INT地図[MAXN] [MAXN]。 28 INT DP [MAXN] [MAXN]。 29 INTパス[MAXN] [MAXN]。 30スタック<整数>秒; 31インラインボイドプリント(int型NUM、INT X) 32 { 33(NUM == 0)戻った場合、 34 s.push(X)。 35プリント(NUM-1、パス[NUM] [X])。 36} 37の符号付きのmain() 38 { 39 freopenは( "flower.in"、 "R"、STDIN)。 40 freopenは( "flower.out"、 "W"、STDOUT)。 41のmemset(DP、128、はsizeof(DP))。 42 F =)(読み取り; V =読み取ります()。 43(I ++; I <= F INT iは= 1)のための 44(J ++のint J = 1; J <= V)用 )45地図[I] [J] =(読み出します。 46(intはI = 1; I <= V; I ++)DP [1]〜[I] =マップ[1]〜[I]。 47(I ++; I <= F intは、I = 2)のための 65のprintf( "\ n"); 48(INT J = I; J <= V-(FI); J ++) 49のための(INT K = 1; K <J、K ++) 50 { 51 IF(DP [I-1] [K] +マップ[ I] [J]> DP [I] [J]) 52 { 53 DP [I] [J] = DP [I-1] [K] +マップ[I] [J]。 54パス[I] [J] = K。 55} 56} 57 INT ANS = -INF、FNUM = 0。 58(INT I 1 =; I <= V; Iは++) 59 IF(DP [F] [I]> ANS) 60 { 61 ANS = DP [F] [I]。 62 FNUM = I。 63} 64ライト(ANS)。 66プリント(F、FNUM)。 67しばらく(s.empty()!) 68 { 69書き込み(s.top()); 70のprintf(」「); 71 s.pop()。 72} 73リターン0。 74}
してくださいギャングの論文(とにかく、私はその手段が論文のか分かりません)
分析
* V F行列を考えます
最初のF行目から旅行に必要な、各列は、番号が除去され、
列と取るべき行の数の数が多数の線に沿ったであろう、それは最大を求めて除去することができます
除去された各列の数字は行の列の数よりも大きくなければならないことに注意してくださいは、行番号、等です
彼らは花の花瓶の前に十分に残しておく必要がありますので、
同様に、各ラインは最大数は以下で花瓶V-(トレッキングのF-数)でなければならないと仮定することができます
したがって、我々は簡単に状態遷移方程式を描くことができます
DP [I] [J] = MAX(DP [I-1] [K])+ D [i]は[J](K <J)のD P [ I ] [ J ] = M A X (DのP [ I - 1 ] [ K ] )+ D [ I ] 、[ J ] (K < J )
DP [I] [J] D P [ I ] [ jは]まで移動する最初から取得し、第i行の第j行番号を削除することができる最大値を示し
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <アルゴリズム> 5の#include <積層体> 6の#define INT長い長い 7の#define MAXN 100 + 10 8の#define INF 9223372036854775807 9を用いて名前空間ははstd; 10インラインintはREAD() 11 { 12 INT X = 0。 13ブールF = 1。 14チャーC = GETCHAR()。 15(;!のisdigit(C); C = GETCHAR())IF(C == ' - ')、F = 0。 (; isdigit(C); C = GETCHAR())x =(x << 3)+(X << 1)+ C-'0' ; 16 17 IF(f)に戻り、X。 18リターン0-X。 19} 20インラインボイド書き込み(INT X) 21 { 22 IF(X <0){のputchar( ' - '); X = -x。 25} 26 int型のF、V。 27 INT地図[MAXN] [MAXN]。 28 INT DP [MAXN] [MAXN]。 29 INTパス[MAXN] [MAXN]。 30スタック<整数>秒; 31インラインボイドプリント(int型NUM、INT X) 32 { 33(NUM == 0)戻った場合、 34 s.push(X)。 35プリント(NUM-1、パス[NUM] [X])。 36} 37の符号付きのmain() 38 { 39 freopenは( "flower.in"、 "R"、STDIN)。 40 freopenは( "flower.out"、 "W"、STDOUT)。 41のmemset(DP、128、はsizeof(DP))。 42 F =)(読み取り; V =読み取ります()。 43(INT I 1 =; I <= F; I ++) 44(INT J = 1; J <= V; J ++) )45地図[I] [J] =(読み出します。 46(intはI = 1; I <= V; I ++)DP [1]〜[I] =マップ[1]〜[I]。 47(I ++; I <= F intは、I = 2)のための 65のprintf( "\ n"); 48(INT J = I; J <= V-(FI); J ++) 49のための(INT K = 1; K <J、K ++) 50 { 51 IF(DP [I-1] [K] +マップ[ I] [J]> DP [I] [J]) 52 { 53 DP [I] [J] = DP [I-1] [K] +マップ[I] [J]。 54パス[I] [J] = K。 55} 56} 57 INT ANS = -INF、FNUM = 0。 58(INT I 1 =; I <= V; Iは++) 59 IF(DP [F] [I]> ANS) 60 { 61 ANS = DP [F] [I]。 62 FNUM = I。 63} 64ライト(ANS)。 66プリント(F、FNUM)。 67しばらく(s.empty()!) 68 { 69書き込み(s.top()); 70のprintf(」「)。 71 s.pop()。 72} 73リターン0。 74}
してくださいギャングの論文(とにかく、私はその手段が論文のか分かりません)