import java.util.*;
public class Main {
public static void main(String[] args) {
//这里是最大递增子序列
Scanner scanner=new Scanner(System.in);
while (scanner.hasNext())
{
String line=scanner.nextLine();
String xxx[]=line.split(" ");
int num []=new int[xxx.length];
for(int i=0;i<xxx.length;i++)
{
num[i]=Integer.parseInt(xxx[i]);
}
TreeSet<Integer> treeSet=new TreeSet();
for(int i=0;i<num.length;i++)
{
treeSet.add(num[i]);//注意题目要求的是严格递增
}
int num2[]=new int[treeSet.size()];
int index=0;
for(int i:treeSet)
{
num2[index]=i;
index++;
}
int m=num.length;
int n=num2.length;
int f[][]=new int[m+1][n+1];
int po[][]=new int[m+1][n+1];
f[0][0]=0;
for(int i=1;i<=m;i++)
{
f[i][0]=0;
}
for(int i=1;i<=n;i++)
{
f[0][i]=0;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(num[i-1]==num2[j-1])
{
f[i][j]=f[i-1][j-1]+1;
po[i][j]=1;
}
else
{
f[i][j]=Math.max(f[i-1][j],f[i][j-1]);
if(f[i][j]==f[i-1][j])
{
po[i][j]=3;
}
else
{
po[i][j]=2;
}
}
}
}
printLCS(po,num,m,n);
System.out.println("");
}
}
private static int sum=0;
private static void printLCS(int[][] po, int[] num, int i, int j) {
if(i==0||j==0)
{
return;
}
if(po[i][j]==1)
{
printLCS(po,num,i-1,j-1);
System.out.print(num[i-1]+" ");
}
else if(po[i][j]==3)
{
printLCS(po,num,i-1,j);
}
else
{
printLCS(po,num,i,j-1);
}
}
}
最长公共子序列(打印出来)
最新推荐文章于 2022-04-23 10:50:46 发布