zoukankan      html  css  js  c++  java
  • 9-合并石子

    /*                                             石子合并(一)
                      时间限制:1000 ms  |  内存限制:65535 KB
                          难度:3

    描述
            有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。

    求出总的代价最小值。

    输入
        有多组测试数据,输入到文件结束。
        每组测试数据第一行有一个整数n,表示有n堆石子。
        接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开
    输出
        输出总代价的最小值,占单独的一行
    样例输入

        3
        1 2 3
        7
        13 7 8 16 21 4 18

    样例输出

        9
        239

    */
    //区间dp: 状态转移方程为 dp[i][j] = min(dp[i][k] + dp[k+1][j])(i <= k <j) + sum[j] - sum[i - 1].
    //通过枚举每一个区间的可能长度2~n,循环求解min();


    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #define MAX 2 << 16
    using namespace std;
    int dp[205][205], sum[205];
    int a[205];

    int main(){
        int n;
        while(~scanf("%d", &n)){
    //        memset(a, 0, sizeof(a));
            memset(dp, 0, sizeof(dp));
            memset(sum, 0, sizeof(sum));
            for(int i = 1; i <= n; i++){
                scanf("%d", &a[i]);
                sum[i] = sum[i - 1] + a[i]; //为保正i-1不越界故i从1开始取
            }
            for(int r = 2; r <= n; r++){ //枚举所有可能的区间长度
                for(int i = 1; i + r - 1 <= n; i++){
                    int j = i + r - 1;   //i确定了,区间长度确定了,j也就确定了
                    dp[i][j] = MAX;
                    for(int k = i; k <= j - 1; k++)
                        if(dp[i][j] > dp[i][k] + dp[k+1][j] + sum[j] - sum[i - 1])
                            dp[i][j] = dp[i][k] + dp[k+1][j] + sum[j] - sum[i -1];                
                }
            }
            printf("%d ", dp[1][n]);
        }
        return 0;
    }

  • 相关阅读:
    python开发必备:virtualenv虚拟环境(自用)
    JavaScript经典实例
    javascript事件驱动及事件处理
    在HTML网页中嵌入脚本的方式
    JavaScript数据结构
    JavaScript语言调试技巧
    CSS+DIV布局
    在HTML文档中应用CSS
    CSS常用属性
    定义CSS
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7397776.html
Copyright © 2011-2022 走看看