羅区P1854問題へのフラワーショップのウィンドウディスプレイソリューション

分析

行列のF *のVを考えます

最初のF行目から移動するために必要な、各列は、番号が除去され、

列と取るべき行の数の数が多数の線に沿ったであろう、それは最大を求めて除去することができます

行の列の数よりも大きくなければならない除去された各列の数字は行番号等、であることに注意してください

彼らは花の花瓶の前に十分に残しておく必要がありますので、

同様に、各ラインは最大数花瓶V-(トレッキングのF-数)以下でなければならないと仮定することができます

したがって、我々は簡単に状態遷移方程式を描くことができます

DP [I] [J] = MAX(DP [I-1] [K])+ D [i]は[J](K <J)D P [ I ] [ J ] = M 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型リード() 
 11  {
 12      INT X = 0 13      ブール F = 1 14      チャー C = GETCHAR()。
15     (;!isdigit(C)と、c = getchar関数())の場合(C == ' - ')は、f = 0 ;
16      のために(; isdigit(C); C = GETCHAR())x =(x << 3)+(X << 1)+ C- ' 0 ' 17      であれば(F) リターンX。
18      リターン 0 - X。
19  }
 20インラインボイド書き込み(INT X)
 21  {
 22      であれば(X < 0){のputchar(' - '); X = -X;}
 23      場合(X> 9)書き込み(X / 10 )。
24      のputchar(Xの%10 + ' 0 ' )。
25  }
 26  int型のF、V。
27  のint マップ[MAXN] [MAXN]。
28  INT DP [MAXN] [MAXN]。
29  INT パス[MAXN] [MAXN]。
30スタック< int型 > S;
31インラインボイドプリント(INT NUM、INT X)
 32  {
 33      であれば(NUMの== 0返します34      s.push(X)。
35      プリント(num- 1 、パス[NUM] [X])。
36  }
 37は、 メイン()符号付き
 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      のためにint型 I = 2 ; iが= Fを<; Iは++ 48          のためのINT J = I; J <= V-(FI); J ++ 49              のためのINT K = 1 ; <J kは、kは++ 50              {
 51                 もし(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          であれば(DP [F] [I]> ANS)
 60          {
 61の              ANS = DP [F] [I]。
62             FNUM = I;
63          }
 64      ライト(ANS)。
65      のprintf(" の\ n " );
66      プリント(F、FNUM)。
67      しばらく(!s.empty())
 68      {
 69          書き込み(s.top());
70          のprintf("  " )。
71          s.pop()。
72      }
 73      リターン 0 74 }

論文をギャングしてください(とにかく、私はそれが論文を何を意味するのか知りません)

おすすめ

転載: www.cnblogs.com/handsome-zyc/p/11627187.html