1.备忘录法
代码如下(示例):
import java.util.Scanner; public class Main{ public static int lookupChain(int p[],int m[][],int i,int j){ if(m[i][j]>0) return m[i][j]; if(i==j) return 0; int u=lookupChain(p,m,i+1,j)+p[i-1]*p[i]*p[j]; for(int k=i+1;k<j;k++){ int t=lookupChain(p,m,i,k)+lookupChain(p,m,k+1,j)+p[i-1]*p[k]*p[j]; if(t<u){ u=t; } } m[i][j]=u; return u; } public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); int p[]=new int[n]; int m[][]=new int[n][n]; for(int i=0;i<n;i++){ p[i]=sc.nextInt(); } System.out.println(lookupChain(p,m,1,n-1)); } } }
2.动态规划
代码如下(示例):
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); int p[]=new int[n]; int m[][]=new int[n][n]; int s[][]=new int[n][n]; for(int i=0;i<n;i++){ p[i]=sc.nextInt(); } matrixChain(p,m,s); System.out.println(m[1][n-1]); } } public static void matrixChain(int[] p, int[][] m,int s[][]) { int l=p.length-1; for(int i=1;i<=l;i++) m[i][i]=0; for(int r=2;r<=l;r++){ for(int i=1;i<=l-r+1;i++){ int j=i+r-1; m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; s[i][j]=i; for(int k=i+1;k<j;k++){ int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; if(t<m[i][j]){ m[i][j]=t; s[i][j]=k; } } } } } }