AOJ0145 Cards

問題リンク Cards

  • 解法

山を重ねるとき、隣り合った者同士で重ねるので部分問題に落とすことができます。
dp[i][j]: i番目からj番目の山を1つにするのにかかる最小コスト
このDP表をiとjの幅wが小さい方から埋めていきます。
基底 dp[i][i](0<=i

  • ソース
import java.util.Arrays;
import java.util.Scanner;

//Cards
public class AOJ0145 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[][] c = new int[n][2];
		for(int i=0;i<n;i++)for(int j=0;j<2;j++)c[i][j]=sc.nextInt();
		int[][] dp = new int[n][n];
		for(int i=0;i<n;i++)Arrays.fill(dp[i], Integer.MAX_VALUE);
		for(int i=0;i<n;i++)dp[i][i]=0;
		for(int w=1;w<n;w++){
			for(int i=0;i+w<n;i++){
				int j = i+w;
				for(int k=i;k<j;k++){
					dp[i][j] = Math.min(dp[i][j], dp[i][k]+dp[k+1][j]+c[i][0]*c[k][1]*c[k+1][0]*c[j][1]);
				}
			}
		}
		System.out.println(dp[0][n-1]);
	}
}