卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

解密USACO 2.3.1最長前綴問題

在USACO競賽中,經(jīng)常會遇到各種有趣而復(fù)雜的問題。今天我們來探討2.3.1版本中的一個關(guān)于最長前綴的問題。題目要求對給定的一個字符串組和一個字符串,找出最長的前綴,使得這個前綴可以由字符串組中的元素

在USACO競賽中,經(jīng)常會遇到各種有趣而復(fù)雜的問題。今天我們來探討2.3.1版本中的一個關(guān)于最長前綴的問題。題目要求對給定的一個字符串組和一個字符串,找出最長的前綴,使得這個前綴可以由字符串組中的元素組成。

---

背包問題的第一印象

當(dāng)我們遇到這個問題時,可能會首先想到使用動態(tài)規(guī)劃中的背包問題來解決。但事實上,有更巧妙的解法等待我們?nèi)グl(fā)現(xiàn)。

---

直接定義bool數(shù)組

其實,我們并不需要定義一個整型的dp數(shù)組,然后在其中存儲前i個元素的最大值。我們可以直接定義一個bool數(shù)組,從前向后循環(huán)一遍,將能湊出的前綴都標(biāo)記為1,其余初始化為0。

---

反向遍歷找出最長前綴

最后,我們可以從后向前遍歷數(shù)組,找出最后一個值為真的位置,并輸出其序號即可。通過類似以下代碼實現(xiàn):

```c

for (i size; i > 0; i--){

if(dp[i] true){

cout << i << endl;

break;

}

}

```

---

完整代碼實現(xiàn)

下面是一個C 的示例代碼,展示了如何實現(xiàn)這個最長前綴問題的算法:

```c

include

include

include

using namespace std;

int main(){

freopen("","r",stdin);

freopen("prefix.out","w",stdout);

char s[200002];

string tmps;

int count0, flag0, size0;

string str[201];

cin >> tmps;

while(tmps[0] ! '.'){

str[count] tmps;

count ;

cin >> tmps;

}

while (!cin.eof()){

flag ();

for(int i 1; i < flag; i ){

s[size i] tmps[i - 1];

}

size flag;

cin >> tmps;

}

int i, j, k, tmpsize;

bool ok, dp[200002];

memset(dp, false, sizeof(bool)*200002);

dp[0] true;

for(i 0; i < size; i ){

if(dp[i] false) continue;

for(j 0; j < count; j ){

tmpsize str[j].size();

ok true;

for(k 0; k < tmpsize; k ){

if(s[i k 1] ! str[j][k]){

ok false;

break;

}

}

if(ok) dp[i tmpsize] 1;

}

}

for(i size; i > 0; i--){

if(dp[i] true){

cout << i << endl;

break;

}

}

return 0;

}

```

通過以上代碼示例,我們可以清晰地了解如何解決這個最長前綴問題。希望這篇文章對你有所幫助!

標(biāo)簽: