双进程类dp即,有两个同时进行的决策,且两个决策互相影响。
比如这道题,我们用一个二维数组f[i][j]表示s1取前i个字符,s2取前j个字符时的最长公共子序列。
显然,可得状态转移方程:
f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]);
特别地,s1[i]==s2[j]时,f[i][j]=max(f[i][j],f[i-1][j-1]+1);
void init()
{
cin>>s1;
for(int i=s1.size();i>=1;--i) s1[i]=s1[i-1];
s1[0]=' ';
cin>>s2;
for(int i=s2.size();i>=1;--i) s2[i]=s2[i-1];
s2[0]='&';
}//字符串处理,整体后移一位避开下标0,我写得极不优美。
void work()
{
memset(f,0,sizeof(f));
for(int i=1;i<s1.size();++i)
for(int j=1;j<s2.size();++j)//最后一位'.'不执行。
{
f[i][j]=max(f[i-1][j],f[i][j-1]);
f[i][j]=max(f[i][j],f[i-1][j-1]);
if(s1[i]==s2[j]) f[i][j]=max(f[i][j],f[i-1][j-1]+1);
}
printf("%d",f[s1.size()-1][s2.size()-1]);
}