hdu 1503 最长公共子序列变型
来源:互联网 发布:公司数据安全管理制度 编辑:程序博客网 时间:2024/05/18 17:42
题解
可知,知道了最长的公共子序列之后才能最小化输出的字母的个数,通过前i-1,j和i,j-1项的最长公共子序列长度来递归打印结果,当最长公共子序列为0时,任意输出前i,j项,当前i-1,j小于i,j-1项的最长公共子序列时,可知第i项为公共部分,所以需要j-1,使得之后可以到达两者的公共部分,而当前i-1,j等于i,j-1项的最长公共子序列,i-1或j-1都可以,因为此时说明i项和j项都不是公共部分或者他们都可以构成长度相同的最长部分,所以选择任意一个都不会影响结果。
代码
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <map>#include <cmath>#include <set>#include <queue>using namespace std;char s1[105],s2[105];int d[105][105];void dfs(int i,int j){ if(d[i][j]==0){ for(int k=0;k<i;k++) printf("%c",s1[k]); for(int k=0;k<j;k++) printf("%c",s2[k]); return; } if(i==0||j==0) return; if(s1[i-1]==s2[j-1]){ dfs(i-1,j-1); printf("%c",s1[i-1]); } else{ if(d[i-1][j]<d[i][j-1]){ dfs(i,j-1); printf("%c",s2[j-1]); } else{ dfs(i-1,j); printf("%c",s1[i-1]); } } return;}int main(){ while(scanf("%s%s",s1,s2)!=EOF){ memset(d,0,sizeof(d)); int len1=strlen(s1),len2=strlen(s2); for(int i=0;i<len1;i++) for(int j=0;j<len2;j++){ if(s1[i]==s2[j]) d[i+1][j+1]=d[i][j]+1; else d[i+1][j+1]=max(d[i][j+1],d[i+1][j]); } //printf("111 %d %d\n",d[len1-1][len2],d[len1][len2-1]); dfs(len1,len2); printf("\n"); } return 0;}
0 0
- hdu 1503 最长公共子序列变型
- hdu 1503 最长公共子序列
- HDU-1503(最长公共子序列加强版)
- 最长公共子序列 HDU 1159/1080/1503
- hdu 1503 Advanced Fruits(最长公共子序列变形)
- hdu 1503(最长公共子序列的升级版)
- HDU 1503(Advanced Fruits)最长公共子序列+路径记录
- HDU-1503(最长公共子序列+路径跟踪)
- hdu 1503 Advanced Fruits 最长公共子序列变形
- HDU 1503 Advanced Fruits (LCS最长公共子序列)
- hdu 1159 (最长公共子序列)
- hdu 1159 最长公共子序列
- HDU 1159 最长公共子序列
- HDU 1159 最长公共子序列
- hdu 1159 最长公共子序列
- HDU 1159 最长公共子序列
- HDU-1159(DP_最长公共子序列)
- HDU 1080 最长公共子序列变形
- 求固定空间的随机数
- 从用户的视角看待网页设计(二)
- 包装类
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
- 状态保留之session存储问题
- hdu 1503 最长公共子序列变型
- 类加载器与 Class.getResourceAsStream 问题解决
- 问题二十一:怎么模拟ray tracing图形中不同材料的颜色(diffuse and metal)
- C++类模板应用基础练习
- 交替字符串
- 基于生产者和消费者问题的总结
- 安装memcached 遇到的问题
- redis 入门级操作----demo
- Redis 数据库之哈希键值对(hash)