首页 > 代码库 > 最长递增公共子序列

最长递增公共子序列

    #include <stdio.h>  
    #include <algorithm>  
    #include <string.h>  
    using namespace std;  
      
    int n,m,a[505],b[505],dp[505][505];  
      
    int LICS()  
    {  
        int MAX,i,j;  
        memset(dp,0,sizeof(dp));  
        for(i = 1; i<=n; i++)  
        {  
            MAX = 0;  
            for(j = 1; j<=m; j++)  
            {  
                dp[i][j] = dp[i-1][j];  
                if(a[i]>b[j] && MAX<dp[i-1][j])  
                    MAX = dp[i-1][j];  
                if(a[i]==b[j])  
                    dp[i][j] = MAX+1;  
            }  
        }  
        MAX = 0;  
        for(i = 1; i<=m; i++)  
            if(MAX<dp[n][i])  
                MAX = dp[n][i];  
        return MAX;  
    }  




优化成一维


#include <stdio.h>  
#include <string.h>  
#include <algorithm>  
using namespace std;  
  
int a[505],b[505],dp[505],n,m;  
  
int LICS()  
{  
    int i,j,MAX;  
    memset(dp,0,sizeof(dp));  
    for(i = 1; i<=n; i++)  
    {  
        MAX = 0;  
        for(j = 1; j<=m; j++)  
        {  
            if(a[i]>b[j] && MAX<dp[j])  
                MAX = dp[j];  
            if(a[i]==b[j])  
                dp[j] = MAX+1;  
        }  
    }  
    MAX = 0;  
    for(i = 1; i<=m; i++)  
        if(MAX<dp[i])  
            MAX = dp[i];  
    return MAX;  
}