CODEVS 1048 石子归并 题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CODEVS 1048 石子归并 题解相关的知识,希望对你有一定的参考价值。

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接:http://codevs.cn/problem/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

 

分析:

区间DP

其实老师要求的是洛谷1880,然而蒟蒻太辣鸡了1880WA掉了qwq

 

 

AC代码:

 

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 
 6 using namespace std;
 7 int n,num,pre[210],f[1000][1000]; 
 8 //pre:前缀和数组 
 9 int main()
10 {
11     scanf("%d",&n);
12     for(int i = 1;i <= n;++ i)
13         scanf("%d",&num),pre[i] = pre[i-1]+num;
14     memset(f,0x3f,sizeof(f));
15     for(int i = 1;i <= 2*n;++ i)
16         f[i][i] = 0;//石子自己和自己归并即不归并,消耗为0 
17     for(int l = 1;l <= n;++ l)
18     {
19         for(int i = 1;i <= n-l;++ i)
20         {
21             int r = l+i;
22             for(int k = i;k < r;++ k)
23             {//枚举k作为l,r的合并终点 
24                 f[i][r] = min(f[i][r],f[i][k]+f[k+1][r]+pre[r]-pre[i-1]);
25             }
26         }
27     }
28     int ans1 = 0x3f3f3f;
29     for(int i = 1;i <= n;++ i)
30         ans1 = min(ans1,f[i][i+n-1]);
31     printf("%d\n",ans1);
32     return 0;
33 }
View Code

 

 

 

以上是关于CODEVS 1048 石子归并 题解的主要内容,如果未能解决你的问题,请参考以下文章

codevs——1048 石子归并 (区间DP)

1048 石子归并codevs

codevs 1048石子归并

[codevs1048]石子归并&&[codevs2102][洛谷P1880]石子归并加强版

codevs 1048 石子归并

codevs1048 石子归并