題目描述
您有乙個字串a1,a2,…,ana1,a2,…,an,由零和一組成。
我們將連續元素ai,ai + 1,...,ajai,ai +1,...,aj(1≤i≤j≤n1≤i≤j≤n)的序列稱為字串aa的子字串。
您可以多次應用以下操作:
選擇乙個字串aa的子字串(例如,您可以選擇整個字串)並反轉它,為此支付xx個硬幣(例如,«0101101»→→«0111001»);
選擇字串aa的一些子字串(例如,您可以選擇整個字串或僅乙個符號),然後將每個符號替換為相反的乙個符號(零替換為乙個,而乙個替換為零),為此支付yy個硬幣(例如,«0101101»→→«0110001»)。
您可以按任何順序應用這些操作。允許將操作多次應用於同一子字串。
您需要花費最少的硬幣數量才能得到僅包含乙個的字串?
輸入值
輸入的第一行包含整數nn,xx和yy(1≤n≤300000,0≤x,y≤1091≤n≤300000,0≤x,y≤109)—字串的長度,第一次操作的成本(反向子串)和第二個操作的成本(反向子串的所有元素)。
第二行包含長度為nn的字串aa,由零和一組成。
輸出量
列印乙個整數-獲得只包含1的字串所需的最低總操作成本。如果不需要執行任何操作,請列印00。
例子
輸入值5 1 10
01000
輸出量11
輸入值5 10 1
01000
輸出量2
輸入值7 2 3
1111111
輸出量0
注意在第乙個示例中,首先需要反轉子字串[1…2] [1…2],然後需要反轉子字串[2…5] [2…5]。
然後,字串更改如下:
«01000»→→«10000»→→«11111»。
運營總成本為1 + 10 = 111 + 10 = 11。
在第二個示例中,首先需要反轉子字串[1…1] [1…1],然後需要反轉子字串[3…5] [3…5]。
然後,字串更改如下:
«01000»→→«11000»→→«11111»。
總成本為1 + 1 = 21 + 1 = 2。
在第三個示例中,字串已經僅包含乙個,因此答案為0。
思路分析:
看這道題,腦子裡立馬就蹦出了dp,前兩道題也都是dp,就堅信這道題得這麼做了,然後就懵了
這道題看起來簡潔明瞭,就是乙個只有0和1的字串,然後對其進行兩種操作:區間內前後翻轉和把區間內0全變為1。然後求把整個字串全變為1的最小代價。
噁心的地方就在這兩種操作都可以執行上了,有點無從下手。
沒辦法,分析樣例。不難發現,可以對資料進行分組,即把多個連在一起的0或1視為乙個整體進行處理(顯然這樣可以盡可能少的處理,代價最小),然後對每組0進行考慮,這時候的字串形式就是類似於0101010……這樣的
我們的最終目的是要把0變為1,你再怎麼換,你也少不了變為0的操作——劃重點,**會體現
我們考慮每兩個相鄰的0101,發現有兩種方法處理:(1)轉一下前面的01,變為1001;然後進行修改,變為1111;(2)進行兩次修改,變為1111;
我們發現,其中都有一次修改操作,那我們比較另乙個不同的即可,顯然誰代價小選哪個,不管你選哪個,都不需要再考慮這前面的一組,如果你變為1了,顯然不用再管了,如果你選擇了轉換,那前面的0和後面的0就成一組0了,接下來再只考慮後面的就可以了。如果你著這樣我們就合併了兩個相鄰的;
接下來,陣列還是101010……的形式,繼續進行如下操作,每組01都是這樣,那就簡單了,如果有n組01,我們把最後一次轉化為1的操作單獨拿出來,剩下的n-1組我們只需進行(n-1)次的單一操作——兩種操作哪個小選哪個。
配合**理解(不懂一定要自己模擬一遍樣例,體會一下過程):
1 #include2 #include3 #include4 #include5using
namespace
std;
6const
int maxn = 3e5+10;7
char
a[maxn];
8long
long
tot;
9int
main()
16if(tot == 0)printf("0"
);17
else printf("
%lld
",min(x,y) * (tot-1) +y); //前tot-1組,單一操作合併為一組,最後再加上一次統一修改的操作
18return0;
19 }
這就是乙個數學題...
L Change the WorLd中的數學題
電影中涉及數學的地方很少有經得起仔細琢磨的。記得 考試一家親 中那個小屁孩兒上去背圓周率沒背幾位就開始亂整了 要想騙騙觀眾,至少你得查一查前20位的精確值吧。這些細節很多電影都忽視掉了,就連電影pi開頭的圓周率都是錯的。但在l change the world裡,幾處涉及數學的地方都經得起推敲。估計...
ACM小明的數學題
小明的數學題 description 小明是個小學五年級的學生,為了早點去看自己愛看的 他想快點把作業做完。可是可惡的數學老師今天卻布置了一道難題,小明想了很久也不知道該怎麼做。你的任務就是幫小明解決掉這道數學題。題目是這樣子的,有兩個實數a,b,計算a b,要求保留小數點後面n 位 0 n 100...
ACM小明的數學題
小明的數學題 description 小明是個小學五年級的學生,為了早點去看自己愛看的 他想快點把作業做完。可是可惡的數學老師今天卻布置了一道難題,小明想了很久也不知道該怎麼做。你的任務就是幫小明解決掉這道數學題。題目是這樣子的,有兩個實數a,b,計算a b,要求保留小數點後面n 位 0 n 100...