码迷,mamicode.com
首页 > 其他好文 > 详细

CODEVS 1048 石子归并 题解

时间:2017-07-17 21:48:19      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:sam   algorithm   output   std   整数   ane   space   pre   位置   

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

题目链接: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 石子归并 题解

标签:sam   algorithm   output   std   整数   ane   space   pre   位置   

原文地址:http://www.cnblogs.com/shingen/p/7197409.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!