最长回文子序列问题
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace palindrome
{
class Program
{
static void Main(string[] args)
{
char[] origin = { 'r', 'a', 'c', 'e', 'c', 'a', 'r' };
char[] test1 = { 'r', 'a', 'c', 'e', 'c', 'a', 'r' };
int len = origin.Length;
int [,] rec = new int [len,len];
int[] mask = new int[len];
Palindrome pal = new Palindrome(rec, len, origin,mask);
pal.Pal_initial();
pal.Pal_length();
pal.Pal_generate(0,len-1,0);
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
{
Console.Write("{0} ", pal.Record[i, j]);
}
Console.Write("\n");
}
for (int i = 0; i < len; i++)
{
if (mask[i]==1)
Console.Write("{0} ", origin[i]);
}
Console.ReadKey();
}
}
class Palindrome
{
public Palindrome(int [,] rec,int len,char [] origin,int [] mask)
{
Record = rec;
Length = len;
Origin = origin;
Mask = mask;
}
public int[,] Record
{ get; set; }
public int Length
{ get; set; }
public char[] Origin
{ get; set; }
private enum Direction:int { Left=0, Right=1 };
public int[] Mask
{ get; set; }
public void Pal_initial()
{
for (int i = 0; i < Length; i++)
{
for (int j = 0; j < Length; j++)
{
if (i == j)
Record[i, j] = 1;
else
Record[i, j] = 0;
}
}
}
public void Pal_length()
{
for (int i = 0; i < Length; i++)
{
Mask[i] = 0;
}
for (int l = 2; l < Length + 1; l++)
{
for (int i = 0; i < Length - l + 1; i++)
{
int j = i + l - 1;
if (Origin[i] == Origin[j])
Record[i, j] = Record[i + 1, j - 1] + 2;
else
for (int k = i; k < j; k++)
{
int q = Record[i, k] > Record[k + 1, j] ? Record[i, k] : Record[k + 1, j];
if (q > Record[i, j])
Record[i, j] = q;
}
}
}
}
public void Pal_generate(int i,int j,int dir)
{
Console.WriteLine("({0},{1})", i, j);
if (dir == (int)Direction.Left)
{
if (i==j)
{
Mask[j] = 1;
return;
}
else if (Record[i, j] > Record[i, j - 1])
{
if (Record[i, j] > Record[i + 1, j])
{
Mask[i] = 1;
Mask[j] = 1;
Pal_generate(i + 1, j - 1, (int)Direction.Right);
}
else
{
Pal_generate(i + 1, j , (int)Direction.Right);
Mask[j] = 1;
}
}
else
{
Pal_generate(i, j - 1, (int)Direction.Left);
}
}
if (dir == (int)Direction.Right)
{
if(Record[i+1,j]==0)
{
Mask[i] = 1;
return;
}
else if (Record[i, j] > Record[i+1, j])
{
if (Record[i, j] > Record[i, j - 1])
{
Mask[i] = 1;
Mask[j] = 1;
Pal_generate(i + 1, j - 1, (int)Direction.Left);
}
else
{
Pal_generate(i , j - 1, (int)Direction.Left);
Mask[i] = 1;
}
}
else
{
Pal_generate(i+1, j, (int)Direction.Right);
}
}
}
}
}