1.1 遞迴方程:
$$f[i][j]=
\left\
&min(f[i][j-1]+1,f[i-1][j]+1,f[i-1][j-1]+(a[i]!=a[j]))&if(i>=1,j>=1) \\\
&i &if(j==0) \\\
&j &if(i==0) \\\
\end
\right.
$$字串ab都是從下標1開始讀入。
方程分析:
$f[i][j]$表示a中前i個字母轉化為b中前j個字母所需最少操作次數。
討論對a中第i個字元操作後,a中前i個字串與b中前j個字串相同。
1.在$a[i]$後增加乙個字母,增加後兩字串相同,則增加的字母必然為$b[j]$。則增加前a的前i個字母與b的前j-1個字母相同。此時$f[i][j]=f[i][j-1]+1$
2.把$a[i]$刪除。刪除後兩字串相同,則刪除前a的前i-1個字母與b的前j個字母相同。此時$f[i][j]=f[i-1][j]+1$
3.把$a[i]$修改為$b[j]$。修改後兩字串相同。則修改前a的前i-1個字母與b的j-1個字母相同。若$a[i]==b[j]$則不需要操作次數。若$a[i]!=b[j]$則需要修改,操作次數加一。
最後把三種情況取個min即可。
考慮邊界情況。$i==0$時則j是多少就要在a中增加多少個字元。$j==0$時,則i是多少就要在a中刪除多少個字元。
1.2給出填表法中表的維度、填表範圍和填表順序
維度是二維。每個狀態只與前面的狀態有關。兩重迴圈i和j分別從1~lena,1~lenb
1.3分析演算法時間複雜度,空間複雜度
a的長度為n,b的長度為m
狀態數為n*m,轉移為o(1)
時間複雜度為o(n*m)。
空間複雜度為o(n*m)。
設計dp方程。找到某個時候與他前乙個時候的關係。來推出遞迴方程
還不錯,比較順利。題目交流後基本都能做出來
演算法第三章作業
1.動態規劃是一種能夠減少重複運算的一種演算法,比較適合原問題能依賴於子問題解得,而子問題也能夠依賴於子子問題解得而出的問題。其次,動態規劃更適合於資料量較多的時候的一種演算法,當資料量沒有到達一定規模的時候,動態規劃演算法不能夠體現出足夠的優勢。如對於揹包問題的貪心演算法和動態規劃法 2.1 單調...
演算法第三章作業
我覺得動態規劃是一種分治法的偽高階型,它將乙個大問題可以分成若干個小問題後,解決子問題,然後將子問題的解插入到乙個表中,用乙個表來記錄所有的已經得到答案的子問題的解,後面就可以發現,無論子問題的解是否被用到,其都在表中,接著求問題便可以節省大量的時間。3 1m i 1 n 1 m i max 1 1...
演算法第三章作業
組員 高珞洋,何汶珊 之前在學習分治法的時候也有將其和動態規劃進行比較,動態規劃能夠解題的根本要求是原問題可以細分成子問題,且原問題的最優解必包含子問題的最優解。為了更明確上述條件,從而保證題目能夠運用動態規劃求解,通常需要兩步操作 明確問題具有最優子結構,並分解問題 找出遞推關係式 狀態轉移方程 ...