動態規劃 最長公共上公升子串行

2021-06-18 11:21:26 字數 1052 閱讀 7551

對於做dp的人而言,規劃處最優子結構是解決一切題目的第一步,二此題的最優越子結構規劃一下,

dp[i][j] 為序列1前i個元素和序列2前j個元素最長公共上公升子串行多長。

那麼這個時候初始值初始化為0的話,碰到序列1和序列2相等的情況只要依靠相等位置前的序列來得出狀態即可,更新完整個dp陣列。

**如下:

#include#includeusing namespace std;

const int n = 505;

int num1[n],num2[n],dp[n][n];

int main()

}for(int j=0;j<=m;j++)answer=max(answer,f[n][j]);

printf("%d\n",answer);

if(t!=0)printf("\n");

}return 0;

}

如果不要求路徑輸出 (如 hdu 1426) 則空間複雜度o(n),若要求路徑輸出,  則空間複雜度o(n^2)

#include #include #define max(x,y) ((x)>(y)?(x):(y)) 

using namespace std;

int data1[505],data2[505];

int dp[505],pre[505][505]; //dp[j]為序列2前j個元素與序列1構成的最長公共上公升子串行的長度

int num[505];

int main ()

if (data1[i]==data2[j])

if (dp[j]>ans)

}} printf("%d\n",ans);

int cas=ans;

for (i=ans;i>=1;i--)

for (i=1;i<=cas;i++)

printf (i==cas?"%d\n":"%d ",num[i]);

} return 0;

}

動態規劃 最長公共上公升子串行LCIS

問題 給定兩個序列a和b,序列的子串行是指按照索引逐漸增加的順序,從原序列中取出若干個數形成的乙個子集,若子串行的數值大小是逐漸遞增的則為上公升子串行,若a和b取出的兩個子串行a1和b1是相同的,則a1 b1為a和b的公共子串行。求出a和b的最長公共上公升子串行。分析 if a i b j dp i...

最長公共上公升子串行

題目描述 給定兩個整數序列,求它們的最長上公升公共子串行。輸入描述 輸入兩組資料,每組資料代表乙個整數序列,其輸入格式為 第一行輸入長度m 1 m 500 第二行輸入該序列的m個整數ai 231 ai 231 輸出描述 輸出共兩行。第一行輸出兩個序列的最長上公升公共子串行的長度l 第二行輸出該子串行...

最長公共上公升子串行

首先,在 a i b j 的時候有 dp i j dp i 1 j 為什麼呢?因為 dp i j 是以b j 為結尾的 lcia 如果dp i j 0 那麼就說明 a 1 a i 中必然有乙個字元 a k 等於b j 如果dp i j 等於0 呢?那賦值與否都沒有什麼影響了 因為 a k a i 那...