题目大意:

找一组最长上升公共子序列,并把任意一组满足的情况输出出来

 

最长公共上升子序列不清楚可以先看这篇文章

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 }
View Code

相关文章: