题目大意:
找一组最长上升公共子序列,并把任意一组满足的情况输出出来
最长公共上升子序列不清楚可以先看这篇文章
http://www.cnblogs.com/CSU3901130321/p/4182618.html
然后在这基础上加回溯,我自己一开始利用两个一维数组写回溯,测了很多数据都没问题
但一直给segment fault,网上也看到有人跟我一样说不知道为什么,一维数组的代码主要函数先放在这里留待以后看能否解决,或者有大神帮忙解决
1 int dp[N] , a[N] , b[N] , rec[N] , fa[N] , src[N] , maxn , cnt; 2 3 void LCIS(int m , int n) 4 { 5 memset(dp , 0 , sizeof(dp)); 6 memset(src , 0 , sizeof(src)); 7 memset(fa , 0 , sizeof(fa)); 8 for(int i = 1 ; i<=m ; i++){ 9 int k = 0; 10 for(int j = 1 ; j<=n ; j++){ 11 if(a[i] == b[j]){ 12 if(dp[j] < dp[k] + 1){ 13 dp[j] = dp[k] + 1; 14 src[j] = i; 15 fa[i] = src[k]; 16 } 17 } 18 if(a[i] > b[j] && dp[k] < dp[j]) k = j; 19 } 20 } 21 22 maxn = 0 , cnt = 0; 23 int s; 24 for(int i = 1 ; i <= n ; i++) 25 { 26 if(maxn < dp[i]) 27 maxn = dp[i] , s = src[i]; 28 } 29 rec[cnt++] = s; 30 while(fa[s]){ 31 rec[cnt++] = fa[s]; 32 s = fa[s]; 33 } 34 }