http://acm.hdu.edu.cn/showproblem.php?pid=1159
我要dpdpdpdpdpdpdp
比较害怕动态规划的题目,状态转移方程经常找不到,比如这一题我还是画出表格才想出来的.
作为小菜鸟一枚也只有这个方法了.
好,以字符串abcfbc 和 abfcab 为例
表格中的数字嘛.....姑且解释为子串的最大公共子串的长度.最优子结构这个东西只能意会啊.
以图中标记的数字为例,它代表 子串 abc 和 abfcab的最长公共子串.
#include <stdio.h>
#include <string.h>
int dp[1001][1001];
int main()
{
char stra[1001],strb[1001];
int i,k,m,n;
while(scanf("%s%s",stra,strb)!=EOF)
{
m=strlen(stra);n=strlen(strb);
memset(dp,0,sizeof(dp));
for(i=1;i<=m;i++)
{
for(k=1;k<=n;k++)
{
if(stra[i-1]==strb[k-1])
dp[i][k]=dp[i-1][k-1]+1;
else
{
dp[i][k]=dp[i-1][k]>=dp[i][k-1]?dp[i-1][k]:dp[i][k-1];
}
}
}
printf("%d\n",dp[m][n]);
}
return 0;
}