我的第一篇解題報告( -。- )
原題點這裡
括號,這是一道普通的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 因為...