其实这东西刚进实验室的时候就学过,当时还不知道dp是啥……记得当时滚动数组优化看了一晚上没学会。。。
现在看来就是一个很基础的dp……
最长公共子序列(LCS) | 勇幸|Thinking
http://www.ahathinking.com/archives/115.html
Hdu 1159
#include <cstdio>
#include <cstring>
#define max(x,y) ((x)>(y)?(x):(y))
/* 滚动数组 */
int dp[2][1005]; /* 存储LCS长度 */
char str[1005],ch[1005];
int main ()
{
while (~scanf("%s%s",str,ch))
{
int lenstr=strlen(str);
int lench=strlen(ch);
memset(dp,0,sizeof(dp));
int k;
for (int i=1;i<=lenstr;i++)
{
k=i&1;
for (int j=1;j<=lench;j++)
if (str[i-1] == ch[j-1])
dp[k][j]=dp[k^1][j-1]+1;
else
dp[k][j]=max(dp[k][j-1],dp[k^1][j]);
}
printf("%d\n",dp[k][lench]);
}
return 0;
}
/*
asdlkfjlksd
sldkfjlksjdf
9
*/
/*Discuss里看到的。。。。
::.--.-.::
:( ( )::::: 东边日出西边雨
(_, \ ) ,_):: 道是无晴却有情 |
:::-'--`--:::::::: ~~| , \ _ /
::::::::::::::::::: ,|`-._/| -== (_) ==-
::::::::^^::::::::.' | /||\ / \
::::::^^::::::::.' | ./ ||`\ |
:::::::::::::::/ `-. |/._ || \
::::::::::::::| || || \
~~=~_~^~ =~ \~~~~~~~'~~~~'~~~~/~~`` ~=~^~
~^^~~-=~^~ ^ `--------------'~^~=~^~_~^=~^~
*/
Poj 2250
#include <cstdio>
#include <cstring>
int dir[102][102],d[102][102];
char a[102][31],b[102][31];
void LCS (int na,int nb)
{
int i,j;
for (i=1;i<=na;i++)
for (j=1;j<=nb;j++)
if (strcmp(a[i-1],b[j-1]) == 0) //找到,向右下
{
d[i][j]=d[i-1][j-1]+1;
dir[i][j]=1;
}
else if (d[i-1][j] > d[i][j-1]) //未找到,向下
{
d[i][j]=d[i-1][j];
dir[i][j]=2;
}
else //未找到,向右
{
d[i][j]=d[i][j-1];
dir[i][j]=3;
}
}
void Output (int i,int j)
{
if (i == 0 || j == 0)
return;
if (dir[i][j] == 1)
{
Output(i-1,j-1);
printf("%s ",a[i-1]);
}
if (dir[i][j] == 2)
Output(i-1,j);
if (dir[i][j] == 3)
Output(i,j-1);
}
int main ()
{
#ifdef ONLINE_JUDGE
#else
freopen("read.txt","r",stdin);
#endif
while (~scanf("%s",a[0]))
{
if (a[0][0] == '#')
break;
memset(dir,0,sizeof(dir));
memset(d,0,sizeof(d));
int i=1,j=0;
while (scanf("%s",a[i]))
{
if (a[i][0] == '#')
break;
i++;
}
while (scanf("%s",b[j]))
{
if (b[j][0] == '#')
break;
j++;
}
LCS(i,j);
Output(i,j);
printf("\n");
}
return 0;
}