O(n^2)
/*poj1080 Sample AGTGATG -GTTA-G score : (-3)+5+5+(-2)+5+(-1) +5=14. 每次讀入2個字符串只有A,T,C,G 可以做3個操作: 1.刪除目標串一個字符 2.刪除原串一個字符,代價是a[?]['-']見表格 3.改變一個字符代價是a[x][y] 求代價最小的使2個字串相同的方法。 dp[i][j]是原串第i個對應目標串第j個的最小代價 dp[i][j]=max(dp[i-1][j]+Del[i]-Del[i-1],dp[i-1][k]+Del1[j-1]-Del1[k]+a[s2[i-1]][s1[j-1]]) */ import java.util.*; public class Main { static int min(int a,int b){return (a<b)? a:b;} static int max(int a,int b){return (a>b)? a:b;} public static void main(String[] args) { Scanner cin=new Scanner(System.in); int n,dp[][]=new int [370][390],a[][]=new int [370][390]; a['A']['A']=5; a['A']['C']=-1;a['A']['G']=-2;a['A']['T']=-1;a['A']['-']=-3; a['C']['A']=-1;a['C']['C']=5; a['C']['G']=-3;a['C']['T']=-2;a['C']['-']=-4; a['G']['A']=-2;a['G']['C']=-3;a['G']['G']=5; a['G']['T']=-2;a['G']['-']=-2; a['T']['A']=-1;a['T']['C']=-2;a['T']['G']=-2;a['T']['T']=5; a['T']['-']=-1; a['-']['A']=-3;a['-']['C']=-4;a['-']['G']=-2;a['-']['T']=-1;a['-']['-']=0; n=cin.nextInt(); while(n-->0) { int l1,l2; String st1,st2; char s1[]=new char [120],s2[]=new char [130]; l1=cin.nextInt(); st1=cin.next(); s1=st1.toCharArray(); l2=cin.nextInt(); st2=cin.next(); s2=st2.toCharArray(); int Del1[]=new int [120],Del2[]=new int[120]; Del1[0]=Del2[0]=0; for(int i=1;i<=l1;i++) Del1[i]=Del1[i-1]+a[s1[i-1]]['-']; for(int i=1;i<=l2;i++) Del2[i]=Del2[i-1]+a[s2[i-1]]['-']; for(int j=0;j<=l1;j++) dp[0][j]=Del1[j]; for(int i=1;i<=l2;i++) { dp[i][0]=Del2[i]; for(int j=1;j<=l1;j++) { dp[i][j]=dp[i-1][j]+Del2[i]-Del2[i-1]; for(int k=0;k<j;k++) dp[i][j]=max(dp[i][j], dp[i-1][k]+Del1[j-1]-Del1[k]+a[s2[i-1]][s1[j-1]]); } } int Ans=Del2[l2]+Del1[l1]; for(int i=1;i<=l2;i++) Ans=max(Ans, dp[i][l1]+Del2[l2]-Del2[i]); System.out.println(Ans); } return ; } }
O(n^2) 只需要從{ ( i-1 , j ) , ( i , j-1 ) , ( i-1 , j-1 ) } 3個點轉移
import java.util.*; public class Main { static int min(int a,int b){return (a<b)? a:b;} static int max(int a,int b){return (a>b)? a:b;} public static void main(String[] args) { Scanner cin=new Scanner(System.in); int n,dp[][]=new int [370][390],a[][]=new int [370][390]; a['A']['A']=5; a['A']['C']=-1;a['A']['G']=-2;a['A']['T']=-1;a['A']['-']=-3; a['C']['A']=-1;a['C']['C']=5; a['C']['G']=-3;a['C']['T']=-2;a['C']['-']=-4; a['G']['A']=-2;a['G']['C']=-3;a['G']['G']=5; a['G']['T']=-2;a['G']['-']=-2; a['T']['A']=-1;a['T']['C']=-2;a['T']['G']=-2;a['T']['T']=5; a['T']['-']=-1; a['-']['A']=-3;a['-']['C']=-4;a['-']['G']=-2;a['-']['T']=-1;a['-']['-']=0; n=cin.nextInt(); while(n-->0) { int l1,l2; String st1,st2; char s1[]=new char [120],s2[]=new char [130]; l1=cin.nextInt(); st1=cin.next(); s1=st1.toCharArray(); l2=cin.nextInt(); st2=cin.next(); s2=st2.toCharArray(); int Del1[]=new int [120],Del2[]=new int[120]; Del1[0]=Del2[0]=0; for(int i=1;i<=l1;i++) Del1[i]=Del1[i-1]+a[s1[i-1]]['-']; for(int i=1;i<=l2;i++) Del2[i]=Del2[i-1]+a[s2[i-1]]['-']; for(int j=0;j<=l1;j++) dp[0][j]=Del1[j]; for(int i=1;i<=l2;i++) { dp[i][0]=Del2[i]; for(int j=1;j<=l1;j++) { dp[i][j]=dp[i-1][j]+Del2[i]-Del2[i-1]; dp[i][j]=max(dp[i][j],dp[i][j-1]+Del1[j]-Del1[j-1]); dp[i][j]=max(dp[i][j], dp[i-1][j-1]+a[s2[i-1]][s1[j-1]]); } } System.out.println(dp[l2][l1]); } return ; } }