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]石子归并的更多相关文章

  1. AC日记——石子归并 codevs 1048

    1048 石子归并  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 有n堆石子排成一列,每堆石子 ...

  2. 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]); 最 ...

  3. 51nod1022 石子归并 V2

    证明w满足四边形不等式,这里w是m的附属量,形如m[i,j]=opt{m[i,k]+m[k,j]+w[i,j]},此时大多要先证明w满足条件才能进一步证明m满足条件证明m满足四边形不等式证明s[i,j ...

  4. Codevs 1048 石子归并

    1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合 ...

  5. Codevs_2102_石子归并2_(环状动态规划)

    描述 http://codevs.cn/problem/2102/ 2102 石子归并 2 时间限制: 10 s 空间限制: 256000 KB 题目等级 : 黄金 Gold           题目 ...

  6. Codevs_1048_石子归并_(动态规划)

    描述 http://codevs.cn/problem/1048/  1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold       题目描述 Des ...

  7. 51 nod 1023 石子归并 V3(GarsiaWachs算法)

    1023 石子归并 V3基准时间限制:2 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一 ...

  8. codevs3002 石子归并 3

    题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使 ...

  9. codevs1048石子归并

    codevs1048 石子归并  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 传送门  http://codevs.cn/problem/1048/ 题目描述 ...

随机推荐

  1. 移动端和PC端通用的三级导航菜单栏

    免责声明: 本博客发布的所有信息资料都将尽可能注明出处.作者及日期,本人无意侵犯他人相关权益,如无意中侵犯了哪个媒体或个人的权益或知识产权,请留言或来信告之,本人将立即给予删除. Demo下载地址:h ...

  2. WildFly 9.0.2+mod_cluster-1.3.1 集群配置

    一.配置背景 最近使用WildFly 9.0.2作为中间件开发系统,给客户不熟的时候需要使用集群来进行负载均衡,一开始想到是使用Nginx.但是只通过Nginx使用 ip_hash 模式没有做到ses ...

  3. virtualbox安装ubuntu出现“The system is running in low-graphics mode”

    cd /etc/X11 sudo mv xorg.conf.failsafe xorg.conf sudo reboot 即可.

  4. 使用RPC 调用NameNode中的方法

    用户在Client 端是很难对 NameNode中的信息进行直接访问的, 所以 ,在Hadoop系统中为 Client端 提供了一系列的方法调用,这些方法调用是通过RPC 方法来实现的, 根据RPC ...

  5. APP评价(星星点赞)很简单

    1.用代码或者storyboard创建5个button(现在一般都是5个星星) 我用的是storyboard 记得一定要设置button的tag值 在.h中 @property (weak, nona ...

  6. weewwe

    http://blog.csdn.net/u013073524/article/details/25912891

  7. 【制作镜像Win*】环境准备

    1. 保证网络通 2. 保证系统为centos6.x/rhel 6.x 3. yum源正确,推荐使用utsc源,nailgun也ok 4.安装软件包 virsh list guestmount yum ...

  8. IF EXIST: The syntax of the command is incorrect.

    Batch 脚本中使用 IF EXIST 语句时,总是提示 The syntax of the command is incorrect. 原始 bat 脚本如下: ECHO OFF SET proj ...

  9. linux管理网络连接指令

    ethtool eth0  查看 eth0对应网卡的设置 ethtool -i eth0 查看 eth0网卡的驱动信息 ethtool -S eth0 查看网卡的统计信息 ethtool -s eth ...

  10. scp 命令使用

    scp 是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且 scp传输是加密的.可能会稍微影响一下速度.当你服 ...