字串變換 (迭代加深加剪枝)

2022-05-09 15:46:57 字數 2379 閱讀 7761

題目這個做法用了38ms,比y總慢。

看到第一眼,嗯~ o( ̄▽ ̄)o,迭代加深,然後按著這個思路往下打,t飛了。

然後加了幾個優化,過了????

首先還是那個迭代加深,但是我們還要加幾個優化。

減少重複搜尋。

看這個規則:\(a->b\),還有字串:\(aa????\),那麼他很有可能會重複搜尋,所以我們要通過指定搜尋順序的方法來減少重複,有人問,不是加個\(pre\)變數儲存上一次時在哪個地方變化不就行了?但是有的時候使用這個規則是在某個規則用了的情況下實施的,所以就不行了(如:\(a->b,b->c\))。

所以我們需要開乙個\(v\)陣列,記錄時間戳,依舊是\(pre\),在這一層中我們就按照\(pre\)不斷往後,同時有乙個要求,就是被替換的區間當中一定要有乙個\(v\)等於當前時間戳,具體實現看下面的**。

可行性判斷優化

我們可以對乙個字串加上他們的ascii碼,記為這個字串的\(sum\)值,然後用乙個\(check\)判斷在經過若干次規則後能不能等於\(ed\)的\(sum\)值。

未用到的優化:

hash(字串匹配)加字首和優化(\(v\)陣列部分判斷區間是否有相等的時間戳),但因為常數較大,且\(check\)用時更長,故不加。

在check函式中,加上長度這個變數,但是因為懶得打,所以沒加。

#include#include#include#define  n  40

using namespace std;

inline int zabs(int x)

inline int mymin(int x,int y)

char st[20][n],ed[n];int v[20][n];

int n,m;

struct change

ch[10];int top,ed_score;

inline bool cmp(change x,change y)

inline int getscore(char *a,int len)//獲取每個字串的sum值

inline bool comp(char *a,char *b,int len)

return 1;

}inline bool pd(int *a,int len,int ti)

return 0;

}inline bool check_dfs(int dep,int val,int res)

inline bool check(int val,int cnt/*剩餘步數*/)

int limit;

bool dfs(int dep,int ti/*時間戳*/,int pre,bool bk)

^6=8008\)

其實還是很大

但事實上,你可以選擇在\(dep\)大一點的時候執行\(check\)函式,例如,如果\(cnt>=1\)再執行,就會變成:\(c_^6=5005\),合理選擇,反正資料弱。

當然,還有可以優化的地方,看這個:

inline int getscore(char *a,int len)//獲取每個字串的sum值

當你把\(a[i]\)換成\(a[i]-'a'+1\)時會在最後乙個點光榮去世,t到**,為什麼,因為:\(1+1=2\)啊,也就是說\("aa"="b"\),啊這。。。。

再看看原來:\(98-97=1\),在不相同的長度下,在不同的長短下,基本上是不會相同的,也就是隱含了長度資訊。(但實際上這道題目其實不止小寫字母,所以他用一些神奇的符號,也是可以讓我們的\(sum\)不再包含位置資訊的,或者專門卡差值也是可以的,但是我們只要給每乙個位置加上乙個較大的數字就可以了。)

繼續深入的思考,那麼在相同的長度下呢?

\("ad=bc"\)?不難發現,這個我們是可以解決的,怎麼解決?我們只要把\(a[i]\)換成\(a[i]*a[i]\)即可,當然這樣子幹說不定會出一些其他問題(時間問題,不是答案問題),比如原本\("at"≠"bd"\),但是現在等於了(只是單純的舉個例子,現實中不一定相等),這樣子搞就想hash一樣,讓出題人更難卡,但是減慢了隨機資料的速度。

那有沒有究極的優化方法呢?

有,前提是要加上長度變數判斷,我們為什麼會怕\("ad"="bc"\),還不是因為每乙個字母的區分度是在是太小了,所以我們要是用乙個更有區分度的方法就好了,例如上文的\(a[i]^2\),當然,我們直接弄成\(\%\)意義下的\(2^\)次冪,這樣區分度絕對很高。這不就是hash嗎。

但實際上,不管怎麼優化,都優化不了乙個軟肋,就是:\("ab"="ba"\),他是我們這個數值判斷最大的弊端,也是很難被改動的,因為這就是這個優化根本上存在的問題,但是速度已經夠快了,不管他了。

但是由於是玄學的判斷,實際效果好不好我是真的不知道,反正不加也能a

單詞接龍的最短字串長度 DFS加剪枝

前幾天又刷到一單詞接龍題,不一樣的是這次要求的是能接龍的最短字串長度,所謂能接龍的意思是最少有兩個單詞能夠接龍 即單詞一的尾字母與單詞二的首字母一樣 如果任意兩個單詞都無法接起來,輸出0。這個題用dfs做是比較簡單的,另外如果加些剪枝的話在大單詞量的時候效率將會提公升很多。剪枝方法 首尾字母相同的單...

字串變換

現有乙個字典,同時給定字典中的兩個字串s和t,給定乙個變換,每次可以改變字串中的任意乙個字元,請設計乙個演算法,計算由s變換到t所需的最少步數,同時需要滿足在變換過程中的每個串都是字典中的串。給定乙個string陣列dic,同時給定陣列大小n,串s和串t,請返回由s到t變換所需的最少步數。若無法變換...

字串變換

字串變換 相信經過這個學期的程式設計訓練,大家對於字串的操作已經掌握的相當熟練了。今天,徐老師想測試一下大家對於字串操作的掌握情況。徐老師自己定義了1,2,3,4,5這5個引數分別指代不同的5種字串操作,你需要根據傳入的引數,按照徐老師的規定,對輸入字串進行格式轉化。徐老師指定的操作如下 1.表示全...