Zipper動態規劃

2021-10-04 12:48:03 字數 1706 閱讀 5348

判斷s1、s2能否混合組成s3,可以先判斷s3的子串能否由前兩者的子串組合而成,最基本的形式是,s3的第乙個字元是否等於s1或s2的第乙個字元。

一、題目簡述

題目大意是給定三個字串,判斷第三個字串能否由前兩個混合成,但是前兩個字串要保持各自的字元順序。

如下的三個字串,c是能由a、b組合成的

string a: cat

string b: tree

string c: tcraete

而下方的三個字串則不滿足要求

string a: cat

string b: tree

string c: catrtee

樣例輸入

3cat tree tcraete

cat tree catrtee

cat tree cttaree

樣例輸出

data set 1: yes

data set 2: yes

data set 3: no

二、問題分析

string 3能由前兩個字串中的字元混合而成,顯然,它的子字串也必然能由前兩個字串混合成。反之,如果string 3的子串不能由string 1和string 2混合而成,那麼該問題的答案就是 no。基於此,我們首先從string 3的第乙個字元開始判斷,依次到前兩個前三個……如果直到最後的全部字元都滿足條件則答案是yes。

定義string 3的前 i+j 個字元,能否由string 1的前 i 個字元和string 2 的前 j 個字元組成的問題,為yes[i][j]。(注意,這裡的 i、j 不是下標,本題的下標都從0開始。)共有兩種情況:

(1)string 1 的第 i 個字元是string 3 的第 i+j 個字元,也即string 1[i-1]=string 3[i+j-1],此時子問題為string 3 的前 i+j-1個字元能否由string 1的前 i-1 個字元和string 2的前 j 個字元組成,即yes[i-1][j]

(2)string 2 的第 j 個字元是string 3 的第 i+j 個字元,也即string 2[j-1]=string 3[i+j-1],此時子問題為string 3 的前 i+j-1個字元能否由string 1的前 i 個字元和string 2的前 j-1 個字元組成,即yes[i][j-1]

三、源**

// zipper.cpp : 

//#include

using

namespace std;

intmain()

}if(yes[len1]

[len2]

) cout <<

"data set "

<< num <<

": "

<<

"yes"

<< endl;

else

cout <<

"data set "

<< num <<

": "

<<

"no"

<< endl;

}return0;

}

POJ2192 Zipper(動態規劃)

這個題目要求判斷2個字串能否組成1個字串,例如cat和tree能組成tcraete。我們定義乙個布林型別的二維陣列array,array i j 表示str1 i 和str2 j 能否組成str i j i 0或者j 0表示空字串,所以初始化時,array 0 j 表示str1的前j個字元是否和st...

077day(動態規劃題(Zipper)的嘗試)

172210704111 陳國佳總結 2017年12月27日 連續077天 內容 這道題按照我的理解,為給兩個字串,按它們字母的順序,看能否組成第三個字串 其中,1這道題我暫時還未解出來,先給一下錯誤 const int num 200 int n,al,bl cin n char a num b ...

動態規劃 什麼是動態規劃?

先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...