这道题一看就是LCS,直接写个裸的,硬搜。TLE
void print(int r,int c,int n)
{
if(dp[r][c]==0)
{
string ss=tp;
ans[ss]=1;
//sprintf(ansstr[cnt++],"%s\n",tp);
return;
}
if(ph[r][c]==1)
tp[n]=sa[r-1],print(r-1,c-1,n-1);
else if(ph[r][c]==3)
print(r,c-1,n),print(r-1,c,n);
else
while(1)
{
if(ph[r][c]==2)
r--;
else if(ph[r][c]==4)
c--;
if(ph[r][c]==1)
{
tp[n]=sa[r-1];
print(r-1,c-1,n-1);
return;
}
else if(ph[r][c]==3)
{
print(r,c-1,n);
print(r-1,c,n);
return;
}
}
}
后来测试了一种样例,就是str和str的倒置。这样的复杂度是2^n。
于是看讨论里面说剪枝,我当时想到的是既然长度一致,那么拥有公共前缀的就可以不搜。同样TLE。因为当dp[i-1][j] 和dp[i][j-1]一样的时候都要二分深搜
接着搜解题报告。
1)首先按照常规的方法求出最长公共子序列的长度
也就是用O(MN)的那个动态规划,结果放在二维数组dp里