hdu 1503 Advanced Fruits(DP)
题意:
将两个英文单词进行合并。【最长公共子串只要保留一份】
输出合并后的英文单词。
思路:
求最长公共子串。
记录路径:
mark[i][j]=-1:从mark[i-1][j]转移而来。
mark[i][j]=0:从mark[i-1][j-1]转移而来。
mark[i][j]=1:从mark[i][j-1]转移而来。
代码:
char s1[105], s2[105]; int dp[105][105]; int mark[105][105]; void print(int x,int y){ if(x==0 && y==0){ return; } if(mark[x][y]==0){ print(x-1,y-1); printf("%c",s1[x-1]); } else if(mark[x][y]==-1){ print(x-1,y); printf("%c",s1[x-1]); } else{ print(x,y-1); printf("%c",s2[y-1]); } } int main(){ while(scanf("%s%s",s1,s2)!=EOF){ int l1=strlen(s1); int l2=strlen(s2); mem(dp,0); rep(i,1,l1){ mark[i][0]=-1; } rep(i,1,l2){ mark[0][i]=1; } rep(i,1,l1){ rep(j,1,l2){ if(s1[i-1]==s2[j-1]){ dp[i][j]=dp[i-1][j-1]+1; mark[i][j]=0; } else if(dp[i-1][j]>dp[i][j-1]){ dp[i][j]=dp[i-1][j]; mark[i][j]=-1; } else{ dp[i][j]=dp[i][j-1]; mark[i][j]=1; } } } print(l1,l2); puts(""); } return 0; }