hdu 1423 Greatest Common Increasing Subsequence 题解

题目描述:给定两个数字数组a[ ],b[ ],求两者的最长上升公共子序列 的长度

思路: 根据题目描述,第一反应就是用动态规划的思路去做这道题,则问题的关键在于找到问题的重复子结构,从而构造出转移方程自底向上求解。 使用dp[i]代表以a数组中第i位元素为结尾的序列与b数组的最长公共子序列的长度。用locate记录每次以a[i]元素结尾,在 b数组中找比a[i]小并且dp值最大的地方。则动态转移方程为dp[i] = dp[locate] +1;

代码如下所示:

   #include
   using namespace std;  
    int  dp[550];  
    int T;  
    int a[550],b[550];  
    int main()  
    {  
        scanf("%d",&T);  
        int m,n;  
        while(T--)  
        {  
            scanf("%d",&m);  
            for(int i=1; i<=m; i++)  
                scanf("%d",&a[i]);  
            scanf("%d",&n);  
            for(int j=1; j<=n; j++)  
                scanf("%d",&b[j]);  
            memset(dp,0,sizeof(dp));  
            dp[0]=-1;  
       
            for(int i=1;i<=m;i++)  
            {  
               int  locate =0;  
                for(int j=1;j<=n;j++)  
                {  
                    if(a[i]>b[j]&&dp[j]>dp[locate])  locate = j;//在 b数组中找比a[i]小并且dp值最大的地方  
                    if(a[i]==b[j])  
                    {  
                        if(locate==0)//如果在前j-1项没有找到比a[i]小的  
                            dp[j]=1; //那么j的dp值就只能等于1  
                        else dp[j] = dp[locate] +1;//否则就以比a[i]小的前面的数里dp值最大的数+1  
                    }  
                }  
            }  
       
            int ans = -1;  
            for(int i =1;i<=n;i++)  
            {  
                if(ans


你可能感兴趣的:(hdu 1423 Greatest Common Increasing Subsequence 题解)