Codevs 1251 括號 解題報告

2021-07-26 11:24:52 字數 1559 閱讀 3882

我的第一篇解題報告( -。- )  

原題點這裡

括號,這是一道普通的dfs+字串處理題,但對於與我這種平時不怎麼碰stl的人來說,光是看題解就足足看了半個小時(我有多弱就不解釋了吧),最後硬是照著別人的題解才勉強打出來了。

但說實話,這道題帶給我的小知識倒真的不少,可以簡單的在這列一下(如果有和我一樣的難兄難弟可以一起看一下哦!):

1. vector的下標是從 0 開始記錄的,而它的size函式則是返回vector內的元素個數,其意是:當你只用push_back函式無腦儲存元素時,應當從 0 一直列舉到 size-1 !

2.vector是可以直接用下標訪問的!(在**中可以看到)

3.string可以直接用相加的方式(+) 來合成串!(同樣也可以在**中看到)

4.函式的返回值居然若此多樣!

題目分析

這是一道喊你新增括號的dfs題,那麼首當其衝的一步,就是應該先知道怎樣新增括號,於是乎,我們覺醒了在小學時學習乘法時的各種經驗,便一下得出了以下結論

1. 對於單獨的兩個元素

(比如 「z" 和 「b」,它們都是在題目中直接給出的資料)

,要把它們組合成乙個串

(至少包含兩個元素)

,那麼會有:(z*b)

2. 對於乙個單獨的元素(還是「z「)與乙個串(比如簡稱它為 「h」),要把它們組合成乙個更大的串,那麼會有:(zh)

3.同2,

對於乙個

串和另乙個串

(比如為「c」和「h」)

,要把它們組合成乙個更大的串,那麼會有(ch)

然後,在得到了這個結論以後,這一切就沒什麼好說了,我們的任務就是用dfs順序來切割子串,貼上借鑑大神的程式,努力分析,一起提公升吧(真的是一起麼...)!

#include#include#includeusing namespace std;

const int n=10+5;

string str[n];

int n;

// dfs(l,r)表示尋找用在(l,r)的資料集合內括號分割所有可能串,而(1,n)即是我們的最終答案

vectorv;

if ( l==r )

if ( l+1==r )

// 正常情況:串與串 或 元素與串 結合(即結論2,3)

for(int cut=l;cutleft=dfs(l,cut);

vectorright=dfs(cut+1,r);

for(int i=0;i>n;

for(int i=1;i<=n;i++) cin>>str[i]; // 讀入資料串

vectorans=dfs(1,n); // vector裡存放了所有滿足括號分割的復合串

for(int i=0;i

或許下一次我不會寫這麼多了吧,額嘿嘿(真的多麼...)。

2017.1.28

1251 括號(遞迴小練)

1251 括號 時間限制 1 s 空間限制 128000 kb 題目等級 gold 計算乘法時,我們可以新增括號,來改變相乘的順序,比如計算 x1,x2,x3,x4,xn的積,可以 x1 x2 x3 x4 xn 1 xn x1 x2 x3 x4 xn 1 xn 你的任務是程式設計求出所有這樣的添括號...

CODE VS 2058 括號序列

題目描述 description定義滿足以下規則字串為規則序列,否則不是規則序列 1 空序列是規則序列 2 如果s是規則序列,那麼 s s 和也是規則序列 3 如果a和b都是規則序列,那麼ab也是規則序列。例如,下面的字串都是規則序列 而以下幾個則不是 現在,給你一些由 構成的字串,請判斷該字串是否...

Codevs 3657括號序列

題目大意 中文題,略 題目思路 區間dp 這個題是問需要新增多少個括號使之成為合法括號序列,那麼我們可以先求有多少合法的括號匹配,然後用字串長度減去匹配的括號數就行 狀態轉移方程主要是對於我們列舉的區間 dp i j 如果 i 和 j 處的括號能夠匹配,則dp i j dp i 1 j 1 1 因為...