質問の意味:
あなたは、単位長さ当たりのある街価格のビルドパイプラインや柱、柱や配管に必要な、A、B 、A 、B
あなたは長与えるN- N- 01 0 、Iシーケンスを特徴と。1 交通のニーズは、ここで、1は示し0 0は、開口部は、ここでの高さは必要としないことを示している2 2は(開始と終了シーケンス必要ないことが保証トラフィック)することができます開いています
示されるように、配管は、赤色、黒色ストラットを表し、我々はいくつかの単位でS字ラインのセクションを構築することができ、それぞれは、3つの部分のセグメントのS字で表すことができる:0.5 0 。横長+ 5つの単位ダクト1。1垂直ダクト部+ 0.5 0 。水平ダクト5単位
左右のストラット支持部セクションの各セグメントは、高さがパイプ端部の柱の高さに等しい有します
あなたはの開口高さのすべての部分ことを確認する必要があります2 同時に2、コストの最小合計はパイプラインや柱を構築します
アイデア:定義された条件は、被写体を与えられるように、経路長をn、2及び各ドットが1又は2の高さを有する、我々は長さIを表現するために二次元配列DP [I] [j]を使用することができます。現在、jの高さでの最小コスト。現在は、私が唯一の2の高さは、1であれば、現在のiが0であれば、私+ 1がそうでなければ私+ 1が0で、2の1、彼の高さであれば、そう、それからすることができます。
状態遷移方程式:
DP [I] [1] =分(DP [I-1] [1] +、B +、DP [I-1] [2] + B + 2 * A)。
DP [I] [2] =分(DP [I-1] [1] + 2 * B + 2 *、DP [I-1] [2] + 2 * B + A)。
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <cmath> の#include <ユーティリティ> の#include <CStringの> する#include < ストリング > の#include <ベクトル> の#include <スタック> の#include < セット > 書式#include <マップ> に#define INF 0x3f3f3f3fを 使用して 名前空間はstdを、 typedefの長い 長いLL。 ペアのtypedef < int型、int型 > PLL。 MAXN = 2E5 + 10 。 const int型 MOD = 1E9 + 7 。 チャーS [MAXN]。 LL DP [MAXN] [ 3 ]。 int型のmain() { IOS :: sync_with_stdio(偽); cin.tie(0 )。 cout.tie(0 )。 int型T; cinを >> トン。 一方、(t-- ) { memsetの(DP、0x3fを、はsizeof (DP))。 INT 、N、B。 CIN >> N >> B。 CIN >> S + 1 ; DP [ 0 ] [ 1 ] = B; 用(INT iは= 1 ; <I = N ++ I ) { もし、(S [I] == ' 1 ' || S [I + 1 ] == ' 1 ' ) { DP [I] [ 2 ] =分( DP [I- 1 ] [ 1 ] + 2 * B + 2 *、DP [I- 1 ] [ 2 ] + 2 * B + )。 } 他 { DP [I] [ 1 ] =分(DP [I- 1 ] [ 1 ] +、B +、DP [I- 1 ] [ 2 ] + B + 2 * )。 DP [I] [ 2 ] =分(DP [I- 1 ] [ 1 ] + 2 * B + 2 *、DP [I- 1 ] [ 2 ] + 2 * B + )。 } } COUT << DP [n]が[ 1 ] << ENDL。 / * coutの<<てendl; 以下のために(INT I 0 =; I <= N; I ++) { 用(INTのJ = 1; J <= 2であり、j ++) { COUT << DP [I] [J] << "「。 } COUT << ENDL。 } * / } 戻り 0 。 }