zoukankan      html  css  js  c++  java
  • dp练习(11)——石子并归

    1048 石子归并

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
     
    题目描述 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

     我已经接受了自己的菜了,反正我就是那种题海战术后才会理解一点的那种弱智。

    #include<bits/stdc++.h>
    using namespace std;
    
    const int INF =0x3f3f3f3f;
    int SUM[1005][1005];
    int dp[1005][1005];
    
    int main()
    {
        int n;
        cin >> n;
        int a[n];
        for(int i=1;i <= n;i++)
        {
            cin >> a[i];
        }
        memset(SUM,0, sizeof(SUM));
        for(int i=1;i <= n;i++)
        {
            SUM[i][i] = a[i];
            for(int j=i+1;j <= n;j++)
            {
                SUM[i][j] = SUM[i][j-1] + a[j];
            }
        }
    
        for(int len=2;len <= n;len++)
        {
            for(int i=1;i <= n-len+1;i++)
            {
                int j = i+len-1;      //这里不懂
                dp[i][j] = INF;
                for(int k=i;k <= j;k++)
                {
                    dp[i][j] = min(dp[i][j],dp[i][k] + dp[k+1][j] + SUM[i][j]);
                }
            }
        }
        cout << dp[1][n] << endl;
    
    
    
        return 0;
    }

    多写几遍就好了咯,脑子笨

  • 相关阅读:
    复利计算-做汉堡,结对2.0-复利计算再升级
    java集合
    java 封装,继承,多态基础
    购物车
    ajax
    演示
    实验四
    实验三
    构建之法6-7章读后感
    作业调度模拟程序
  • 原文地址:https://www.cnblogs.com/cunyusup/p/8367687.html
Copyright © 2011-2022 走看看