□Problem
文字列sとtのLCS(Longest Common Subsequence:最長共通部分文字列)を求めよ.
□Solution
lcs(i,j)をsのi文字目までの部分文字列とtのj文字目までの部分文字列のLCSとすると,
lcs(i,0)=0
lcs(0,j)=0
lcs(i,j)=lcs(i-1,j-1)+1 (sのi文字目とtのj文字目が等しい場合)
lcs(i,j)=max(lcs(i,j-1),lcs(i-1,j)) (sのi文字目とtのj文字目が等しくない場合)
これらを使ってDP.
□Code
package p1458;
import java.util.*;
import java.lang.*;
import java.math.*;
public class Main{
Scanner sc=new Scanner(System.in);
void run(){
for(; sc.hasNext();){
String s=sc.next();
String t=sc.next();
int m=s.length();
int n=t.length();
int[][] dp=new int[n+1][m+1];
for(int j=1; j<=n; j++){
for(int i=1; i<=m; i++){
if(s.charAt(i-1)==t.charAt(j-1))
dp[j][i]=dp[j-1][i-1]+1;
else
dp[j][i]=Math.max(dp[j-1][i], dp[j][i-1]);
}
}
println(""+dp[n][m]);
}
}
void println(String s){
System.out.println(s);
}
void print(String s){
System.out.print(s);
}
public static void main(String[] args){
new Main().run();
}
}
0 件のコメント:
コメントを投稿