[wikioi]石子归并
http://wikioi.com/problem/1048/
区间型动态规划。参考PPT:http://wenku.baidu.com/view/73c1ded5b9f3f90f76c61bc4.html
首先对于这样的动态规划,我现在的经验是可以有两种思路一是从k到k+1,二是分左右两段,此题就是分左右两段。在PPT中的题目,是一个环(或者圈),最后又有一个优化,就是把n个的环变成2*n个的Array,这样就把复杂度保持在O(n^3)。当然本题是非环,更简单一点。
在PPT的总结里也写到:
该类问题的基本特征是能将问题分解成为两两合并的形式。解决方法是对整个问题设最优值,枚举合并点,将问题分解成为左右两个部分,最后将左右两个部分的最优值进行合并得到原问题的最优值。有点类似分治的解题思想。
设前i到j的最优值,枚举剖分(合并)点,将(i,j)分成左右两区间,分别求左右两边最优值。
状态转移方程的一般形式如下:
F(i,j)=Max{F(i,k)+F(k+1,j)+决策,k为划分点
#include <iostream>
#include <climits>
#include <cstring>
using namespace std;
int w[100+5];
int t[100+5][100+5]; // sum from i to j
int f[100+5][100+5]; // min sum to merge from i to j
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> w[i];
}
// pre-process
for (int i = 0; i < n; i++)
{
for (int j = i; j < n; j++)
{
if (j == i)
{
t[i][j] = w[j];
}
else
{
t[i][j] = t[i][j-1] + w[j];
}
}
}
memset(f, 0, sizeof(f));
for (int len = 2; len <= n; len++)
{
for (int i = 0; i+len <= n; i++)
{
int j = i+len-1;
f[i][j] = INT_MAX;
for (int k = i; k < j; k++)
{
if (f[i][k]+f[k+1][j] < f[i][j])
f[i][j] = f[i][k]+f[k+1][j];
}
f[i][j] = f[i][j] + t[i][j];
}
}
cout << f[0][n-1] << endl;
return 0;
}
有这么几点:
1.其实这题和Scramble String很像,那题当时用的是备忘录方法,主要是觉得这样的循环难写,现在知道了可以从长度len从小到大循环。因为大的长度都是依赖于小的长度的;
2.我用了二维数组来存从i到j的和,但其实用一维数组就可以,只存从0到i的sum,那么到时候sum[j]-sum[i-1]就是了;
[wikioi]石子归并的更多相关文章
- 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/ 题目描述 ...
随机推荐
- I2C Verilog的实现(二)
1. 起始结束信号的判断 //--------------------------------------------- //start,stop condition judgement //---- ...
- JS设置打印页面并调用本地打印机打印页面
<script type="text/javascript"> var hkey_key; var hkey_root = "HKEY_CURRENT_USE ...
- ThinkPHP函数详解:N方法
N方法属于计数器方法,被用于核心的查询.缓存统计的计数和统计.但是其实可以用于应用的其他计数用途,用法比较简单,调用格式:N('计数位置'[,'步进值'])例如,我们要统计页面中的查询次数,可以用 N ...
- 强大的游戏开发工具Unity3D推出2D开发工具,unity将混合3D与2D开发
2013 Unity全球开发者大会(Unite 2013)于2013年8月28日在温哥华隆重开幕,会上Unity全球CEO David Helgason在Keynote上宣布Unity 4.3版本即将 ...
- 20151207jquery 学习笔记 Ajax
.load()方法是局部方法,因为他需要一个包含元素的 jQuery 对象作为前缀.而$.get()和 $.post()是全局方法,无须指定某个元素.对于用途而言,.load()适合做静态文件的异步获 ...
- MVC小系列(十一)【Html.BeginForm与Ajax.BeginForm】
Html.BeginForm与Ajax.BeginForm都是mvc的表单元素,前者是普通的表单提交,而后者是支持异步的表单提交,直接用mvc自带的Ajax.BeginForm就可以很容易完成一个异步 ...
- MarkDown Pad2的一些用法
一.标题 1.使用命令Ctrl+1 标题一 2.使用文字回车后,加上"-"号,再回车.就有如下的示例: 标题二 注意:减(-)号是用于最近的那一行文字变成标题. 二.背景 例如我要 ...
- 使用hwclock同步RTC(硬件时钟)和OS Clock(操作系统时钟)
Linux下面有个命令叫做hwclock,其主要的功能是用来在RTC和操作系统之间进行时钟同步.既可以将RTC的时钟同步到操作系统,也可以在通过hwclock将当前系统时间.Internet时间.本地 ...
- 图像储存容器Mat[OpenCV 笔记11]
IplImage 与 Mat IplImage是OpenCV1中的图像存储结构体,基于C接口创建.在退出之前必须release,否则就会造成内存泄露.在一些只能使用C语言的嵌入式系统中,不得不使用. ...
- 在Windows下用gSoap实现简单加法实例
实现一个简单的a+b程序,在服务器端写一个程序,里面包含了a+b的函数,然后通过客户端代码向其发送两个数字,在服务器运算得到结果返回给客户端显示出来. 1.在gSoap的官网上下载文件夹,本人的版本是 ...