动态规划之石子合并
来源:互联网 发布: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);
}
}
- 动态规划之石子合并
- 动态规划之石子合并
- 动态规划之石子合并
- 转贴:动态规划之石子合并
- 动态规划之石子合并(2)
- 动态规划专题之石子合并
- 动态规划-合并石子
- [动态规划] 石子合并
- 动态规划:石子合并问题
- 动态规划石子合并问题
- 动态规划(合并类)--石子合并
- 合并类动态规划,石子归并,合并石子解题报告
- 动态规划入门 合并石子 COGS1660 石子合并
- 石子合并问题 --动态规划--解法1
- 石子合并(动态规划)详细解题报告
- 石子合并——动态规划
- 石子合并(动态规划)详细解题报告
- 石子合并(动态规划)详细解题报告
- C经典之9-system,if,do,while---ShinePans
- 关于派生类拷贝构造函数中使用基类私有类对象成员的问题
- LeetCode 016 3Sum Closest
- https原理及tomcat配置https方法
- GCD:嵌套dispatch_async时__block对象的一个内存陷阱
- 动态规划之石子合并
- C++ string 用法详解
- 比较好的 文章博客整理 持续更新。。。
- Java String对象的经典问题(new String())
- django--视图函数的包装(Wrapping view function)
- Vbox 未指定XXX网络名称 找不到网卡问题
- execute、executeQuery和executeUpdate之间的区别
- Android的View绘制过程,onMeasure()方法介绍
- UINavigationBar 自定义