Поиск LCS с помощью DP

Я использовал динамическое программирование, чтобы найти самую длинную общую подпоследовательность ч/б двух строк. Что не так в коде. Почему он всегда дает ответ как 0?

#include<bits/stdc++.h>
using namespace std;

int dp[20][20];
void initialize()
{
    for(int i=0;i<20;i++)
        for(int j=0;j<20;j++)
            dp[i][j]=-1;
}
int lcs(string a,string b,int m,int n)
{
    if(m==0||n==0) 
        return 0;
    if(dp[m][n]!=-1) 
        return dp[m][n];
    if(a[m-1]==b[n-1]) 
        return  dp[m-1][n-1] = 1+lcs(a,b,m-1,n-1);
    if(a[m-1]!=b[n-1])
        return dp[n-1][m-1]=max(dp[n][m-1]=lcs(a,b,n,m-1),dp[n-1][m]=lcs(a,b,n-1,m));
}
int main()
{
    string a="AGGTAB",b="GXTXAYB";

    cout<<lcs(a,b,a.length(),b.length());

}

person Tanmay Khandelwal    schedule 16.12.2017    source источник
comment


Ответы (1)


  1. Вы забыли вызвать initialize()
  2. 18-я строка, это должно быть dp[m][n], а не dp[m-1][n-1]
  3. Закомментирован код 19-й строки, так как в нем нет необходимости, и чтобы код был совместим со всеми компиляторами.

т. е. какой-то компилятор может выдать предупреждение: управление достигает конца непустой функции [-Wreturn-type]

  1. Сделал некоторые изменения кода в 20-й строке, так как вы, кажется, перепутали переменные m & n.

Код:

#include<bits/stdc++.h>
using namespace std;
int dp[20][20];
void initialize()
{
    for(int i=0;i<20;i++)
        for(int j=0;j<20;j++)
            dp[i][j]=-1;
}
int lcs(string a,string b,int m,int n)
{
    if(m==0||n==0) 
        return 0;
    if(dp[m][n]!=-1) 
        return dp[m][n];
    if(a[m-1]==b[n-1]) 
        return dp[m][n] = 1+lcs(a,b,m-1,n-1);
    //if(a[m-1]!=b[n-1])
    return dp[m][n]=max(lcs(a,b,m-1,n),lcs(a,b,m,n-1));
}   
int main()
{
    string a="AGGTAB",b="GXTXAYB";
    initialize();
    cout<<lcs(a,b,a.length(),b.length());
}

Выход:

4

person Jagadeesh Pulamarasetti    schedule 16.12.2017