Brackets Sequence 解題報告

2021-08-30 22:03:21 字數 1082 閱讀 5475

思路:先放一段核心**解釋,然後再附上**。

解釋:核心**解釋:字串陣列s儲存著輸入的字串,

dp[i][j]則用來表示區間[i,j]之間的括號匹配數,

然後當區間[i,j]中兩段不匹配時,c[i][j]就表示區間[i,j]裡最佳的新增括號的位置,表示需要在[i,c[i][j]][c[i][j]+1,j]中繼續列舉。

而當兩段匹配時,c[i][j]則等於-1,dp[i][j]=dp[i+1][j-1],表示需要在[i+1,j-1]裡繼續列舉。

**:

void dp() 

if( ( (s[i]== '(' && s[j] == ')' )||(s[i]== '[' &&s[j] == ']') )&&dp[i][j]>dp[i+1][j-1])

}}

接下來的是輸出函式**的解釋:由上面核心**段的解釋可知道c[i][j]為區間[i,j]裡需要新增括號的地方,若區間兩端相等,c[i][j]=-1,向區間[i+1,j-1]進行遞迴輸出;若兩段不相等,則向區間[i,c[i][j]]和區間[c[i][j]+1,j]兩個區間進行遞迴輸出。若i=j,則直接進行括號匹配輸出。

以下為輸出函式的**:

void print(int i,int j) 

if(c[i][j]>0)

else

else

}}

關鍵的自定義函式**都解釋完了,那就貼上完整的**塊了:

#include #include const int max=0x3f3f3f3f;

int n,c[105][105],dp[105][105];

char s[105];

void print(int i,int j)

if(c[i][j]>0)

else

else

}}void dp()

if( ( (s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']') )&&dp[i][j]>dp[i+1][j-1])

}}int main()

USACO Hamming Codes 解題報告

資料小,暴力搜尋可以搞定。但是推薦使用dfs,每個節點 數 有取與不取兩個分支。注意 0是必須出現的。證明如下 最終得到的結果序列中,0是必須出現的,證明如下 如果存在另乙個滿足要求的結果序列s 其最小值為a1 n 0,那麼序列s s n 是滿足條件的最小解,且首元素為0 id xpli1 prog...

USACO Closed Fences 解題報告

幾何題看著就很有畏懼感。這裡用的是最 的演算法,時間複雜度應該在n 2。還沒看別人的解題報告,不過我猜nlogn的解法是有的。比如判斷乙個fence是不是valid的時候,這裡將所有的線段兩兩比較,看是否相交。但是有個叫line sweep的演算法,可以在nlogn的時間複雜度內完成。既然accep...

Wiggle Subsequence解題報告

這道題和最長子序列,divisible subset題目類似,都可以用o n2 的時間複雜度完成。可以想象,對於第i個數,dp i dp j 1,當且僅當dp j 1 dp i 而且nums j 和nums i 的差值和j所處位置的差值符號相反。所以,如下 class solution if dp ...