動態規劃之字串拆分

2021-06-23 05:58:07 字數 1410 閱讀 9243

某種字串處理語言允許程式設計師將乙個字串拆分為兩段。由於此操作需要複製字串,因此要花費n個時間單位來將乙個n個字元的字串拆為兩段。假定乙個程式設計師希望將乙個字串拆分為多段,拆分的順序會影響所花費的總時間。例如,假定這個程式設計師希望將乙個20個字元的字串在第2個,第8個以及第10個字元後進行拆分(字元由左至右,從1開始公升序編號)。如果她按由左到右順序進行拆分,則第一次拆分花費20個時間單位,第二次拆掉分花費18個時間單位(在第8個字元處拆分3-20間的字串)而第三次拆分花費12個時間單位,共花費50個時間單位。但如果她按由右至左的順序進行查分,第一次拆分花費12個時間單位,第二次拆分花費10個時間單位,而第三次拆分花費8個時間單位,共花費38個時間單位。還可以按其他順序,比如,她可以首先在第8個字元處進行拆分(時間20),接著在左邊一段第2個字元處進行拆分(時間8),最後在右邊一段第10個字元處進行拆分(時間12),總時間為40.

設計演算法,對給定的拆分位置,確定最小代價的拆分順序,更形式化地,給定乙個n個字元的字串s和乙個儲存m個拆分點的陣列l[1..m],計算拆分的最小代價,以及最優拆分序列。

解題思路:字串拆分可以看做是矩陣鏈乘法的乙個翻版,只是要注意邊界條件。字串拆分要二個拆分點之間必須有乙個拆分點才能拆分,cost[i][j]表示從第i個拆分點到第j個拆分點最小花費。那麼需要滿足j-i>=2條件才可拆分。於是有如下遞迴式:

遞迴式:當j-i<=1時 cost[i,j]=0;當j-i>=2時,cost[i,j]=min.這樣根據遞迴式,我們可以寫出如下**。

**如下:

#include using namespace std;

#define n 7//變更拆分點數目

void break_string(int l,int break[n+1])

,i; for (int l=2;l<=n;l++)

{for ( i=1;i<=n-l+1;i++)

{int j=i+l-1;

if(j-i>=2) cost[i][j]=0x7fffffff;//if(j-i>=2)//這裡和矩陣鏈不同,需要加限制條件。

for (int k=i+1;k<=j-1;k++)//這裡也和矩陣鏈不同,需要從k=i+1開始

{int temp=cost[i][k]+cost[k][j]+l[j-1]-l[i-1]+1;

if (temp=2)

{//既然是字串拆分,那麼拆分點i與j之間必須還有乙個拆分點,所以j-i至少是2

cout<樣例輸出:

總結:和矩陣鏈乘法一樣,都是o(n³)時間,占用o(n²)空間。只要看懂書上矩陣鏈乘法那節就可以輕鬆理解這個題目。

演算法導論之動態規劃 字串拆分問題

某種字串處理語言允許程式設計師將乙個字串。原題如下圖,最近在刷演算法導論的題目,覺得這題有趣,寫下自己的想法和大家分享一下。圖1 動態規劃演算法首先要證明其滿足動態規劃演算法的兩個基本條件 1.最優子結構 2.重疊子問題。首先來考慮重疊子問題,對於字串s,假設第一次拆分點為l k 則要變為s 0,l...

Abseil之拆分字串

在任何通用程式語言中,將字串分割成子串是乙個常見的任務,c 也不例外。當谷歌出現需求時,許多任務程師發現自己正艱難地通過乙個不斷增長的標頭檔案分割函式的泥潭。您可能已經找到了滿足您需求的輸入引數 輸出引數和語義的神奇組合。在研究了600 行頭檔案中的50 個函式之後,您可能最終決定了乙個類似spli...

oracle之字串拆分

create table zylemp ename varchar2 50 insert into zylemp values 中國 insert into zylemp values 中國 湖北 insert into zylemp values 中國 湖北 黃岡 insert into zyle...