對於做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 那...