1. 程式人生 > >最長連續公共子串、最長公共子串(可以非連續)、最長回文串(連續)、最長回文串(可以不連續)、最長遞增數組的求解

最長連續公共子串、最長公共子串(可以非連續)、最長回文串(連續)、最長回文串(可以不連續)、最長遞增數組的求解

鑲嵌 wid 方法 數量 子串 進行 遞增 動態 動態規劃

問題:最長連續公共子串、最長公共子串(可以非連續)、最長回文串(連續)、最長回文串(可以不連續)、最長遞增數組、長方形鑲嵌最多的求解

方法:上述問題有相似性,都可以采用動態規劃進行求解。

(1)最長連續公共子串:

如果A[i]==B[j], dp[i][j]=dp[i-1][j-1]+1;

否則,dp[i][j]=0;

(2)最長公共子串(可非連續):

如果A[i]==B[j], dp[i][j]=dp[i-1][j-1]+1;

否則,dp[i][j]=dp[i-1][j-1];

(3)最長回文串(可非連續):

先將原字符串A逆序得到新字符串B,然後采用最長公共子串(可非連續)進行求解。

(4)最長連續回文串:

先將原字符串A逆序得到新字符串B,然後采用最長連續公共子串進行求解。

(5)最長連續遞增數組:

如果A[i]>A[i-1],dp[i]=dp[i-1]+1;

否則,dp[i]=0;

(6)最長遞增數組(可非連續):

如果A[i]>A[i-1],dp[i]=dp[i-1]+1;

否則,dp[i]=dp[i-1];

(7)長方形鑲嵌數量:

先按照長方形的長進行升序排序(如果長一樣,寬大的排後邊);

如果A[i].length>A[i-1].length且A[i].width>A[i-1].width,則dp[i]=dp[i-1]+1;

否則,dp[i]=dp[i-1];

最長連續公共子串、最長公共子串(可以非連續)、最長回文串(連續)、最長回文串(可以不連續)、最長遞增數組的求解