poj 2250 Compromise

/* Name:poj 2250 Compromise Author: UnimenSun Date: 15/05/2011 19:29 Description: 最长公共子序列变形 */ /* 解题报告:最长公共子序列变形题 解析: 与最长公共子序列不同的时,需要打印方案,解法方法为,在dp的同时,记住方案,也就是代码中的rem数组, 但是该题于DAG DP输出方案不同,不能直接记住方案,这样就给设置一个特殊值,然后递归打印时,遇见书已定的 特殊值时,进行相应的操作即可 */ #include <iostream> #include <cstdio> #include <cstring> using namespace std; char szText1[101][31]; char szText2[101][31]; int dp[101][101]; int rem[101][101]; //记打印方案 //打印输出方案 void print(int i, int j) { if(i==0 || j==0) return ; if(rem[i][j] == 1) { print(i-1, j-1); printf("%s ",szText1[i]); } if(rem[i][j] == 2) print(i-1, j); if(rem[i][j] == 3) print(i, j-1); } int main() { int index1, index2; int i, j; while(scanf("%s", szText1[1])!=EOF && szText1[1][0]!='#') { //输入 index1 = 2; while(1) { scanf("%s", szText1[index1++]); if(szText1[index1-1][0] == '#') break; } index2 = 1; while(1) { scanf("%s", szText2[index2++]); if(szText2[index2-1][0] == '#') break; } memset(dp, 0, sizeof(dp)); memset(rem, 0, sizeof(rem)); for(i=1; i<index1-1; ++i) { for(j=1; j<index2-1; ++j) { if(strcmp(szText1[i], szText2[j]) == 0) { dp[i][j] = dp[i-1][j-1] + 1; rem[i][j] = 1; } else { if(dp[i-1][j] > dp[i][j-1]) { dp[i][j] = dp[i-1][j]; rem[i][j] = 2; } else { dp[i][j] = dp[i][j-1]; rem[i][j] = 3; } } } } print(index1-2, index2-2); printf("/n"); } return 0; }

你可能感兴趣的:(poj 2250 Compromise)