HDU 1503-Frutas avanzadas (Programación dinámica, LCS)

Enlace de tema:

http://acm.hdu.edu.cn/showproblem.php?pid=1503

Frutas avanzadas

Límite de tiempo: 2000/1000 MS (Java / otros) Límite de memoria: 65536/32768 K (Java / otros)
Envíos totales: 3622 Envíos aceptados: 1872
Juez especial


Descripción del problema
La empresa "21st Century Fruits" se ha especializado en la creación de nuevos tipos de frutas mediante la transferencia de genes de una fruta al genoma de otra. La mayoría de las veces este método no funciona, pero a veces, en casos muy raros, surge una nueva fruta que sabe a mezcla entre ambos. 
Un gran tema de discusión dentro de la empresa es "¿Cómo deben llamarse las nuevas creaciones?" Una mezcla entre una manzana y una pera podría llamarse manzana-pera, por supuesto, pero esto no suena muy interesante. El jefe finalmente decide usar la cadena más corta que contiene ambos nombres de las frutas originales como subcadenas como el nuevo nombre. Por ejemplo, "applear" contiene "apple" y "pear" (APPLEar y apPlEAR), y no hay una cadena más corta que tenga la misma propiedad. 

Por lo tanto, una combinación de un arándano y una mora se llamaría "mora" o "mora de craboys", por ejemplo. 

Su trabajo consiste en escribir un programa que calcule el nombre más corto para una combinación de dos frutas dadas. Su algoritmo debería ser eficiente; de ​​lo contrario, es poco probable que se ejecute en el tiempo asignado para nombres largos de frutas. 
 

Aporte
Cada línea de la entrada contiene dos cadenas que representan los nombres de las frutas que deben combinarse. Todos los nombres tienen una longitud máxima de 100 y solo constan de caracteres alfabéticos.

La entrada finaliza al final del archivo. 
 

Producción
Para cada caso de prueba, genere el nombre más corto de la fruta resultante en una línea. Si es posible más de un nombre más corto, cualquiera es aceptable.
 

Entrada de muestra
  
   
   
manzana melocotón ananas plátano pera melocotón
 

Salida de muestra
  
   
   
Appleach Plátanos Pearch
 
//LCS
//求出最长公共子序列
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define maxn 1005
using namespace std;

int dp[maxn][maxn];
int mark[maxn][maxn];
int l1, l2;
char s1[maxn], s2[maxn];

//求出最长公共子序列,并利用mark数组来标记选了哪个字符串
void LCS()
{
	memset(dp, 0, sizeof(dp));
	memset(mark, 0, sizeof(mark));
	for(int i=1; i<=l1; i++)
        mark[i][0] = -1;
    for(int i=1; i<=l2; i++)
        mark[0][i] = 1;
	for(int i=1; i<=l1; i++)
		for(int j=1; j<=l2; j++)
		{
			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;
			}
		}
}

//回朔输出
void print_LCS(int s, int t)
{
	if(!s && !t)
		return;
	if(mark[s][t]==0)
	{
		print_LCS(s-1, t-1);
		printf("%c", s1[s-1]);
	}
	else
		if(mark[s][t]==1)
		{
			print_LCS(s, t-1);
			printf("%c", s2[t-1]);
		}
	else
		{
			print_LCS(s-1, t);
			printf("%c", s1[s-1]);
		}
}
int main()
{
	while(cin>>s1>>s2)
	{
		l1 = strlen(s1);
		l2 = strlen(s2);
		LCS();
		print_LCS(l1, l2);
		printf("\n");
	}
	return 0;
}



Supongo que te gusta

Origin blog.csdn.net/qq_31281327/article/details/76358214
Recomendado
Clasificación