Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

也可以都反过来,弄2个first数组,dp求最长LCS长度时从后往前递推(用于dfs时减枝),求所有LCS时顺着走,每位从a试到z,这样,就不用排序了……

Posted by xieofyu at 2012-09-03 15:37:29 on Problem 1934 and last updated at 2012-09-03 16:02:02
In Reply To:转个解题报告。。 Posted by:damacheng009 at 2010-11-21 21:33:31
#include <stdio.h>
#include <string.h>

#define STR_LEN 81
#define NUM_LCS 1000

int  dp[STR_LEN][STR_LEN], first_a[STR_LEN][26], first_b[STR_LEN][26], la, lb, lcs_len, num_lcs;
char sa[STR_LEN], sb[STR_LEN], tmp[STR_LEN], lcs[NUM_LCS][STR_LEN];

int get_len()
{
	int i, j;
	for(i = la - 1; i >= 0; i--) {
		for(j = lb - 1; j >= 0; j--) {
			if(sa[i] == sb[j])
				dp[i][j] = dp[i + 1][j + 1] + 1;
			else
				dp[i][j] = dp[i + 1][j] >  dp[i][j + 1] ? dp[i + 1][j] : dp[i][j + 1];
		}
	}
	return dp[0][0];
}

void get_first(char *s, int first[][26], int len)
{
	int i, j;
	for(i = 0; i < 26; i++)
		first[len][i] = -1;
	for(i = len - 1; i >= 0; i--) {
		for(j = 0; j < 26; j++)
			first[i][j] = first[i + 1][j];
		first[i][s[i] - 'a'] = i;
	}
}

void dfs(int ia, int ib, int id)
{
	int i, nid = id + 1;

	if(id == lcs_len) {
		strcpy(lcs[num_lcs++], tmp);
		return;
	}

	if(dp[ia][ib] + id < lcs_len || ia >= la || ib >= lb)
		return;

	for(i = 0; i < 26; i++) {
		if(first_a[ia][i] >= 0 && first_b[ib][i] >= 0) {
			tmp[id] = i + 'a';
			dfs(first_a[ia][i] + 1, first_b[ib][i] + 1, nid);
		}
	}
}

int main()
{
	int i, j, k, end;
	scanf("%s%s", sa, sb);
	la = strlen(sa);
	lb = strlen(sb);
	lcs_len = get_len();
	get_first(sa, first_a, la);
	get_first(sb, first_b, lb);
	dfs(0, 0, 0);
	for(i = 0; i < num_lcs; i++)
		printf("%s\n", lcs[i]);
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator