http://poj.org/problem?id=1458
此题是最长公共子序列,dp基础题,首先是推出状态方程dp[i][j] = dp[i-1][j-1]+1 (dp[i-1][j-1] 是前一个状态),用二维是因为有两个序列的比较,如果遇到不符合条件的 ,则选择最优的 dp[i][j] = max(dp[i-1][j],dp[i][j-1]),
dp[i-1][j] (当前位置的前一个状态),dp[i][j-1](前一个位置的当前状态)。总之,当前状态只与前一个状态有关。
dp最重要的是状态转移方程。
#include
#include
char s1[1000];
char s2[1000];
int dp[1000][1000];
int max(int a,int b)
{
return a > b ? a : b;
}
int main()
{
while(scanf("%s%s",s1,s2)!=EOF)
{
memset(dp,0,sizeof(dp));
int n = strlen(s1);
int m = strlen(s2);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
if(s1[i-1] == s2[j-1])
dp[i][j] = dp[i-1][j-1] + 1;/*符合条件,当前状态,是由前一状态推出*/
else{
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);/*若不符合条件,当前状态记录前两种状态中的最优解*/
}
}
printf("%d\n",dp[n][m]);/*最终状态dp[n][m]记录最优解*/
}
}