• 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的代价就可以.

  • 相关阅读:
    使用快慢指针求解「环形链表」so easy!
    位运算中异或的常见用法总结
    LeetCode 第 131 号问题:分割回文串
    从简单二叉树问题重新来看深度优先搜索
    拓扑排序原理与解题套路
    人越老,脸皮越厚
    反直觉的「生日悖论」问题
    天真!这简历一看就是包装过的
    如何在 GitHub 上找到免费且实用的软件?
    如何在 10 亿数中找出前 1000 大的数
  • 原文地址:https://www.cnblogs.com/chilumanxi/p/5136126.html
Copyright © 2020-2023  润新知