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

2021-06-26 14:45:38 字數 1251 閱讀 9937

某種字串處理語言允許程式設計師將乙個字串。。。原題如下圖,最近在刷演算法導論的題目,覺得這題有趣,寫下自己的想法和大家分享一下。

圖1 動態規劃演算法首先要證明其滿足動態規劃演算法的兩個基本條件:1.最優子結構;2.重疊子問題。

首先來考慮重疊子問題,對於字串s,假設第一次拆分點為l[k],則要變為s[0,l[k]]和s[l[k],max]兩段字串,處理代價為max,接下來就要s[0,l[k]]和

s[l[k],max],每次處理方式又是相同的。

代價可以計為pay(s)=pay(s[0,l[k]])+pay(

s[l[k],max])+max,當pay(

s[0,l[k]])+pay(

s[l[k],max])之和取到最小值時,就有最小值。故也滿足最優子結構。

接下來,就要推導遞推式,pay(s)=min(pay(

s[0,l[k]])+pay(

s[l[k])+max,k屬於1到m.

我們可以先計算pay(s[l(i),l(i+2)])的值,

之後計算pay(s[l(i),l(i+3)])的值,

在計算pay(s[l(i),l(i+4)])

直到得到pay(s)的值。

這是基本思路,**如下:

#include int main()

{ //輸入部分

cout<

int n;

cin>>n;

cout<

int m;

cin>>m;

int* l=new int(m+2);

for(int i=1;i<=m;i++)

cin>>l[i];

l[0]=0;

l[m+1]=n;

int max_num=999999;

//輸入部分

int s[100][100];//用於s[l(i)][l(j)]儲存最小代價;

//計算

for(int j=0;j<=m;j++)

s[l[j]][l[j+1]]=0;

int k,x,y;

for ( k=2;k<=m+1;k++)

{ int q=m-k+1;

for( x=0;x<=q;x++)

{ max_num=999999;

for ( y=1;y

動態規劃之字串拆分

某種字串處理語言允許程式設計師將乙個字串拆分為兩段。由於此操作需要複製字串,因此要花費n個時間單位來將乙個n個字元的字串拆為兩段。假定乙個程式設計師希望將乙個字串拆分為多段,拆分的順序會影響所花費的總時間。例如,假定這個程式設計師希望將乙個20個字元的字串在第2個,第8個以及第10個字元後進行拆分 ...

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...