动态规划之石子合并

来源:互联网 发布:ubuntu vi-tiny 编辑:程序博客网 时间:2024/06/03 02:00

问题描述:

      有n堆石子排成一圈,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1]。问安排怎样的合并顺序,能够使得总合并代价达到最小。


package com.java.dp;

import java.util.Scanner;

/**
 * 围成一圈的石子合并问题
 * j-i=d  d=0··m
 * dp[i][j]=max{dp[i][j],dp[i][k]+dp[k+1][j]+cos[i][j]}
 */
public class MergeStone {
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        int m=scan.nextInt();
        int[][]dp=new int[2*m+1][2*m+1];
        int[][]dy=new int[2*m+1][2*m+1];
        int[][]cos=new int[2*m+1][2*m+1];       
        int[]a=new int[2*m+1];
        //石头初始化
        for(int i=1;i<=m;i++){
            a[i]=scan.nextInt();
            a[m+i]=a[i];
        }
        //i到j石子权重
        for(int i=1;i<2*m+1;i++){
            for(int j=i;j<2*m+1;j++){
                for(int k=i;k<=j;k++){
                    cos[i][j]+=a[k];                   
                } 
            }           
        }
        // j-i=d
        for(int d=0;d<m;d++)
        for(int i=1;i<=2*m;i++){
            for(int j=i;j-i<=d&&j<=2*m;j++){
                if(i!=j) dy[i][j]=Integer.MAX_VALUE;
                for(int k=i;k<j;k++){           
                    dp[i][j]=Math.max(dp[i][j],dp[i][k]+dp[k+1][j]+cos[i][j]);
                    dy[i][j]=Math.min(dy[i][j],dy[i][k]+dy[k+1][j]+cos[i][j]);
                }
            }    
        } 
        int max=0,min=Integer.MAX_VALUE;
        for(int i=1;i<=m;i++){
            if(max<dp[i][i+m-1]){
                max=dp[i][i+m-1];
            }
            if(min>dy[i][i+m-1]){
                min=dy[i][i+m-1];
            }
        }
        System.out.println("max: "+max);
        System.out.println("min: "+min);
    }
}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 索尼手机密码忘了怎么办 索尼笔记本密码忘了怎么办 索尼手机解锁密码忘了怎么办 索尼记录仪密码忘了怎么办 索尼z3手机忘记开机密码怎么办 索尼忘记锁屏密码怎么办 索尼手机忘记锁屏密码怎么办 忘了手机解锁图案怎么办 索尼手机忘记开机密码怎么办 索尼笔记本开机密码忘了怎么办 手机的开机密码忘了怎么办 联想手机开机密码忘了怎么办 红米note3忘记开机密码怎么办 小米2忘了密码怎么办 小米笔记本电脑忘记开机密码怎么办 小米笔记本忘记开机密码怎么办 小米手机儿童模式忘记密码怎么办 小米应用锁密码忘了怎么办 小米air密码忘了怎么办 小米4密码忘了怎么办 小米手机开机密码忘了怎么办? 小米笔记本电脑开机密码忘了怎么办 小米笔记本开机密码忘了怎么办 htc手机忘记解锁图案怎么办 红米手机屏幕锁定怎么解锁怎么办 小米5s有id怎么办 手机密码找不回来了怎么办? 手机密码图案忘了怎么办 手机屏幕图案锁忘了怎么办 捡到苹果7有id锁怎么办 魅族什么都忘了怎么办 海信电视百事通登陆失败怎么办 去哪儿换号了怎么办 ipan充不进去电怎么办 安卓数据线松了怎么办 索尼z5耳机掉漆怎么办 索尼z5无限重启怎么办 苹果8基带坏了怎么办 oppo手机忘记图案密码怎么办 电池充不进去电怎么办 电脑充不进去电怎么办