【a903】石子归并
Time Limit: 10 second
Memory Limit: 2 MB
问题描述
在一个圆形操场的四周摆放着N堆石子(N<= 100),现要将石子有次序地合并成一堆.规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.编一程序,由文件读入堆栈数N及每堆栈的石子数(<=20).
选择一种合并石子的方案,使用权得做N-1次合并,得分的总和最小。
Input
第一行为石子堆数N; 第二行为每堆的石子数,每两个数之间用一个空格分隔.
Output
输出总和最小
Sample Input
4
4 5 9 4
Sample Output
43
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=a903
【题解】
线性的话可以写出
f[i][j]表示i..j这些石子合在一起的最小代价;
换成环的话;可以改成
f[i][j]表示从第i个石子开始i..i+j-1合在一起需要的最小代价;因为变成环了;所以把a[1..n]复制到a[n+1..2n];就好
f[i][j] = min(f[i][j],f[i][k]+f[i+k][j-k]+s[i+j-1]-s[i-1]);
当然s[i]也要多复制一遍;
同时i要循环到2*n才行;当中如果出现i+j>=2*n就不继续了;否则那些f[i][j]i大于n的时候,j如果是合法的继续搞;(即i+j<=2*n);这样f[i+k][j-k]才能在用之前被算出来;
【完整代码】
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 110;
const int INF = 0x3f3f3f3f;
int n,a[MAXN],s[MAXN];
int f[MAXN*2][MAXN];
int main()
{
//freopen("F:\\rush.txt","r",stdin);
scanf("%d",&n);
for (int i = 1;i <= n;i++)
scanf("%d",&a[i]);
for (int i = n+1;i <= 2*n;i++)
a[i] = a[i-n];
for (int i = 1;i <= 2*n;i++)
s[i] = s[i-1]+a[i];
memset(f,INF,sizeof(f));
for (int i = 1;i <= 2*n;i++)
f[i][1] = 0;
for (int l = 2;l <= n;l++)
for (int i = 1;i <= 2*n && i+l<=2*n;i++)
for (int k = 1;k<=l-1;k++)
f[i][l] = min(f[i][l],f[i][k]+f[i+k][l-k]+s[i+l-1]-s[i-1]);
int ans = f[1][n];
for (int i = 2;i <= n;i++)
ans = min(ans,f[i][n]);
printf("%d\n",ans);
return 0;
}
【a903】石子归并的更多相关文章
- AC日记——石子归并 codevs 1048
1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 有n堆石子排成一列,每堆石子 ...
- 51nod 1021 石子归并(dp)
51nod 1021 石子归并 题解:从i到j合并的最小值:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]); 最 ...
- 51nod1022 石子归并 V2
证明w满足四边形不等式,这里w是m的附属量,形如m[i,j]=opt{m[i,k]+m[k,j]+w[i,j]},此时大多要先证明w满足条件才能进一步证明m满足条件证明m满足四边形不等式证明s[i,j ...
- Codevs 1048 石子归并
1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合 ...
- Codevs_2102_石子归并2_(环状动态规划)
描述 http://codevs.cn/problem/2102/ 2102 石子归并 2 时间限制: 10 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目 ...
- Codevs_1048_石子归并_(动态规划)
描述 http://codevs.cn/problem/1048/ 1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Des ...
- 51 nod 1023 石子归并 V3(GarsiaWachs算法)
1023 石子归并 V3基准时间限制:2 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一 ...
- codevs3002 石子归并 3
题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使 ...
- codevs1048石子归并
codevs1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 http://codevs.cn/problem/1048/ 题目描述 ...
- luogu P1880石子归并
石子归并 luogu1880 传送门 noi1995 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得 ...
随机推荐
- BootStrap_table.js 学习
@{ Layout = null; ViewBag.Title = "基于BootstrapTable的简单应用";} <!--添加相关样式引用--><link ...
- HDU 2633 Getting Driving License(模拟)
Getting Driving License Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- (JavaScript基础向)日常小发现:forEach等函数的第二个参数的用法
forEach函数用得平时用得比较多,但是从来没想到forEach函数还有第二个参数. 这里是菜鸟教程对forEach函数的详细说明:forEach的详细说明. 如上图,forEach函数有第二个参数 ...
- SpringMVC框架中的异常解析器-ExceptionHandler和HandlerExceptionResolver
SpringMVC框架中,处理异常还是挺方便的,提供了一个异常解析器. 处理局部异常 @Controller public class AccessController { /** * 处理这个Con ...
- 03007_JDBC概述
1.JDBC概述 (1)JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用J ...
- [Redux-Observable && Unit testing] Testing the output of epics
Epics can be unit-tested just like any other function in your application - they have a very specifi ...
- 基本3D变换之World Transform, View Transform and Projection Transform
作者:i_dovelemon 来源:CSDN 日期:2014 / 9 / 28 主题:World Transform, View Transform , Projection Transform 引言 ...
- 用Zebra打造Linux下小型路由器
用Zebra打造Linux下小型路由器 现在的Internet网络相当庞大,不可能在不同的网络之间建立直接的连接,所以这时就必须用路由器为不同网络之间的通信提供路径选择.Linux下搭建路由器价格非常 ...
- 动态链接库DLL的创建生成及调用
一.背景 最近在做CANTOUSB底层驱动的调用,是调用别人已经封装好的库,看不到别人写的源程序.程序中调用的是隐式调用即 x.h+x.lib+x.dll,其中DLL即是动态链接库(Dynamic L ...
- 【例题 8-7 UVA - 11572】Unique Snowflakes
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 类似尺取法. 用set判断这段区间有没有重复的数字. 有的话,就把头节点的那个数字删掉,直到没有为止. [代码] /* 1.Shou ...