题目链接

题意:环形的一群石子,每次可以选择相邻的两堆合并,分数为新得到的一堆石子,求将这片石子合并成一堆的最大和最小分数

输入:第一行一个正整数n,其后n个数代表每堆石子的个数

分析:第一次写的时候我想当然的写的状态转移方程是dpx[l][r]=max(dpx[l+1][r]+a[l][r],dpx[l][r-1]+a[l][r]);(dpx是指这个dp数组用来求最大分数),想的是左右逼近,但是我这个状态转移方程有个非常致命的缺点,那就是合并的两堆石头,一定有一堆是没经过合并的,这很明显无法代表全部情况,万一正解就是左边一半合并成一起,右边一半合并成一起,然后左右合并,我的算法就肯定得不到答案。

搜了搜正解,正解状态转移方程是dp1[l][r]=max(dp1[l][r],dp1[l][k]+dp1[k+1][r]+d(l,r));通过枚举一个k来实现将左右两堆合并在一起的情况

然后再注意题目中的石子是成环的,所以需要用2n的数组来存储,最后遍历也是同样。

另外dp[i][i]这种单一数组的分数是0,所以dp2数组决不能一开始fill成inf,只能在一个具体的定义下设为inf,具体看代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=<<;
const int maxn=;
const double pi=acos(-);
const int mod=1e9+;
int a[maxn],sum[maxn];
int dp1[maxn][maxn],dp2[maxn][maxn];
int d(int x,int y){
return sum[y]-sum[x-];
}
int main(){
int n;scanf("%d",&n);
//fill((int *)dp2,(int *)dp2+maxn*maxn,inf);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
a[i+n]=a[i];
sum[i]=sum[i-]+a[i];
}
for(int i=n+;i<=*n;i++){
sum[i]=sum[i-]+a[i];
}
for(int len=;len<=n;len++){
for(int l=;(l+len-)<=*n;l++){
int r=l+len-;
dp2[l][r]=inf;
for(int k=l;k<r;k++){//注意k是比r小的,因为是左边是l到k,右边是k+1-r
dp1[l][r]=max(dp1[l][r],dp1[l][k]+dp1[k+][r]+d(l,r));
dp2[l][r]=min(dp2[l][r],dp2[l][k]+dp2[k+][r]+d(l,r));
}
}
}
int mx=,mn=inf;
for(int i=;i<=n;i++){
mx=max(mx,dp1[i][i+n-]);
mn=min(mn,dp2[i][i+n-]);
}
cout<<mn<<endl<<mx<<endl;
return ;
}

区间DP经典 石子合并的更多相关文章

  1. nyoj737区间dp(石子合并)

    石子合并(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述     有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的 ...

  2. hihocoder1636 Pangu and Stones(区间DP(石子合并变形))

    题目链接:http://hihocoder.com/problemset/problem/1636 题目大意:有n堆石头,每次只能合并l~r堆,每次合并的花费是要合并的石子的重量,问你合并n堆石子的最 ...

  3. 区间dp之 "石子合并"系列(未完结)

    A. 石子合并<1> 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统评测 方式:文本比较   题目描述 有N堆石子排成一排(n<=100),现要将石 ...

  4. 整数划分——区间dp(石子合并)

    这不是将一个数以一来划分,而是把一个整数以位来划分 题目描述 如何把一个正整数N(N长度<20)划分为M(M>1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式 ...

  5. 51Nod 1021 石子归并(区间dp经典入门)

    题意: N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价. n<=100 思 ...

  6. 2017北京网络赛 J Pangu and Stones 区间DP(石子归并)

    #1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...

  7. POJ 3280 Cheapest Palindrome (区间DP) 经典

    <题目链接> 题目大意: 一个由小写字母组成的字符串,给出字符的种类,以及字符串的长度,再给出添加每个字符和删除每个字符的代价,问你要使这个字符串变成回文串的最小代价. 解题分析: 一道区 ...

  8. POJ 3280 Cheapest Palindrome ( 区间DP && 经典模型 )

    题意 : 给出一个由 n 中字母组成的长度为 m 的串,给出 n 种字母添加和删除花费的代价,求让给出的串变成回文串的代价. 分析 :  原始模型 ==> 题意和本题差不多,有添和删但是并无代价 ...

  9. tyvj 1055 沙子合并 区间dp经典模型,石子合并

    P1055 沙子合并 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述     设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=300).每堆沙子 ...

随机推荐

  1. java操作Maven

    记录瞬间 import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import ...

  2. 查看Python、flask 版本

    查看Django版本检查是否安装成功,可以在dos下查看Django版本. 1.输入python 2.输入import django3.输入django.get_version() 查看flask版本 ...

  3. Unity shader之ColorMask

    Color Mask解释,见unity文档: ColorMask ColorMask RGB | A | 0 | any combination of R, G, B, A Set color cha ...

  4. Oarcle之事务

    update:更新 例如转账: update emp_ temp set sal = sal-500 where ename = 'JONES':(更新表中sal项 为sal-500 是当ename= ...

  5. 微信小程序数组对象

    xml:<block wx:for="{{post_key}}" wx:for-item="{{item}}"></block> dat ...

  6. SQL并发处理方案——乐观锁和悲观锁

    (一)乐观锁和悲观锁的概念 悲观锁 在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法.它可以阻 ...

  7. 软件目录结构规范(以python为例)

    为什么要设计好目录结构   "设计项目目录结构",就和"代码编码风格"一样,属于个人风格问题.对于这种风格上的规范,一直都存在两种态度: 一类同学认为,这种个人 ...

  8. 这个表明将http协议转成websocket协议

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. cent OS 7查询IP

    环境: win7旗舰版 VMware Workstation Pro (虚拟机软件) CentOS-7-x86_64-DVD-1804.iso 安装时选择了默认配置,最小系统安装. 安装好后用  if ...

  10. 阿里云windows 2008 服务器处理挖矿程序 Miner

    阿里云盾最近报发现wanacry蠕虫病毒和挖矿进程异常 仔细检查进程后,发现两个奇怪的进程 Eternalblue-2.2.0.exe,winlogins.exe 特别是伪装成 winlogins.e ...