• CODE[VS] 1048 石子归并


    题目描述 Description

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

    输入描述 Input Description

    第一行一个整数n(n<=100)

    第二行n个整数w1,w2...wn  (wi <= 100)

    输出描述 Output Description

    一个整数表示最小合并代价

    样例输入 Sample Input

    4

    4 1 1 4

    样例输出 Sample Output

    18

    数据范围及提示 Data Size & Hint


    对于这个题目,是一个典型的区间型DP,是一道比较经典的题目,这道题我们写出的动态DP方程是这样的:
    dp[i][j] = min{dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]}, i <= k < j (i !+ j)
              =  0 (i = j)
    这里的i到j是指i到j所需要的最小的代价.
    我们还要借助一个额外的数组sum来记录从i到j的大小,这个时候我们只需要记录从1到最后n的每一段的代价,最后进行相减就可以求出i到j的重量.
    每当合成了一堆以后我们就要减少我们总遍历的个数.即每合并一次总数减1.
    我们只需要从左边开始遍历即可.就可以得到所有的情况:
    /*************************************************************************
        > File Name: 石子合并.cpp
        > Author: zhanghaoran
        > Mail: chilumanxi@gmail.com 
        > Created Time: 2015年06月22日 星期一 22时34分28秒
     ************************************************************************/
    
    #include <iostream>
    #define INF 10000000
    
    using namespace std;
    
    
    int dp[101][101];
    int sum[101];
    int m[101];
    int n;
    
    int main(void){
    	cin >> n;
    	sum[0] = 0;
    	for(int i = 1; i <= n; i ++){
    		cin >> m[i];
    		sum[i] = sum[i - 1] + m[i];
    		dp[i][i] = 0;
    	}
    	for(int t = 2; t <= n; t ++){
    		for(int i = 1; i <= n - t + 1; i ++){
    			int j = i + t - 1;
    			int MAX = INF;
    			for(int k = i; k < j; k ++){
    				if(MAX > dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1])
    					MAX = dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1];
    			}
    			dp[i][j] = MAX;
    		}
    	}
    	cout << dp[1][n];
    	return 0;
    }

    最后我们只要读出1到n的代价就可以.

  • 相关阅读:
    逻辑卷扩容
    iptables网络防火墙||SNAT,DNAT等转发路由动作
    常用rman操作语句
    常用Oracle的SQL语句
    oracle中的单引号和双竖线||以及q'间隔符
    网站升级HTTPS教程
    站长必备:网站被黑后怎么快速搞定
    常见HTTP错误代码
    在Android中实现一个简易的Http服务器
    Android开发新手常见的10个误区
  • 原文地址:https://www.cnblogs.com/chilumanxi/p/5136126.html
Copyright © 2020-2023  润新知