区间DP模板题

区间DP模板Code:

for(int len=;len<=n;len++)
{
for(int i=;i<=*n-;i++) //区间左端点
{
int j = i + len - ; //区间右端点
for(int k=i;k<j;k++) //断点位置
{
f[i][j] = min(f[i][j],f[i][k] + f[k + ][j] + s[j] - s[i - ]);
}
}
}

题目描述

在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。

试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.

输入输出格式

输入格式:

数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.

输出格式:

输出共2行,第1行为最小得分,第2行为最大得分.

输入输出样例

输入样例#1: 4 4 5 9 4

输出样例#1: 43 54

这个题的数据存储特点有一点代表性:破环成列,把长度为n的环转换为长度为2n-1的列,再进行一次动归。

针对于这个题的n很小,我们就可以用它来代表区间长度,这样O(n ^ 3)也能跑过去了

区间DP的概念就是把一个区间的状态一直分割为它的子区间的状态,一直到这个子区间的状态是显然可求的,最后再将它们综合起来

举个栗子:

f[i][j]中我们可以将[i,j]这一个区间划分为[i,k]和[k + 1,j]这两个区间的总状态再进行一次操作

这个的边界就是[i,k]和[k + 1,j]是显然可求的状态

这个题要求一个最大值和最小值的问题

我们可以显而易见地发现最小值一定小于等于最大值

这样我们可以只建立一个数组先求最小再求最大,节省了两个数组的空间(虽然这不是重点qwq)

Code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int f[][]; //节省空间
int s[];
int n,x,ans = ;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&x);
s[i] = s[i - ] + x;
s[i + n] = s[i]; //把长度开到 2n - 1
}
for(int i=;i<n;i++)
s[i + n] += s[n];
memset(f,,sizeof(f)); //初始化
for(int i=;i<=*n-;i++)
f[i][i] = ;
for(int len=;len<=n;len++)
{
for(int i=;i<=*n-;i++) //区间左端点
{
int j = i + len - ; //区间右端点
for(int k=i;k<j;k++) //断点位置
{
f[i][j] = min(f[i][j],f[i][k] + f[k + ][j] + s[j] - s[i - ]);
}
}
}
for(int i=;i<=n;i++)
ans = min(ans,f[i][i + n - ]);
printf("%d\n",ans); //最小值一定比最大值要小,所以无需更新
for(int len=;len<=n;len++)
{
for(int i=;i<=*n-;i++) //区间左端点
{
int j = i + len - ; //区间右端点
for(int k=i;k<j;k++) //断点位置
{
f[i][j] = max(f[i][j],f[i][k] + f[k + ][j] + s[j] - s[i - ]);
}
}
}
for(int i=;i<=n;i++)
ans = max(ans,f[i][i + n - ]);
printf("%d\n",ans);
return ;
}

[洛谷P1880][NOI1995]石子合并的更多相关文章

  1. 洛谷 P1880 [NOI1995]石子合并 题解

    P1880 [NOI1995]石子合并 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试 ...

  2. 洛谷P1880 [NOI1995]石子合并 纪中21日c组T4 2119. 【2016-12-30普及组模拟】环状石子归并

    洛谷P1880 石子合并 纪中2119. 环状石子归并 洛谷传送门 题目描述1 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石 ...

  3. 洛谷 P1880 [NOI1995] 石子合并(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是石子合并问题稍微升级版 这道题和经典石子合并问题的不同在于,经典的石子合 ...

  4. 洛谷P1880 [NOI1995] 石子合并 [DP,前缀和]

    题目传送门 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆 ...

  5. 洛谷 P1880 [NOI1995]石子合并

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  6. 洛谷 P1880 [NOI1995]石子合并(区间DP)

    嗯... 题目链接:https://www.luogu.org/problem/P1880 这道题特点在于石子是一个环,所以让a[i+n] = a[i](两倍长度)即可解决环的问题,然后注意求区间最小 ...

  7. 【区间dp】- P1880 [NOI1995] 石子合并

    记录一下第一道ac的区间dp 题目:P1880 [NOI1995] 石子合并 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码: #include <iostream> ...

  8. P1880 [NOI1995]石子合并[区间dp+四边形不等式优化]

    P1880 [NOI1995]石子合并 丢个地址就跑(关于四边形不等式复杂度是n方的证明) 嗯所以这题利用决策的单调性来减少k断点的枚举次数.具体看lyd书.这部分很生疏,但是我还是选择先不管了. # ...

  9. 区间DP小结 及例题分析:P1880 [NOI1995]石子合并,P1063 能量项链

    区间类动态规划 一.基本概念 区间类动态规划是线性动态规划的拓展,它在分阶段划分问题时,与阶段中元素出现的顺序和由前一阶段的那些元素合并而来由很大的关系.例如状态f [ i ][ j ],它表示以已合 ...

随机推荐

  1. 【python】mongo删除数据

    参考:https://stackoverflow.com/questions/23334743/setting-justone-limiter-for-pymongo-remove-throws-ty ...

  2. Python基础之递归函数与二分法

    一.递归函数 定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 我们来举个例子吧,比如:有个人问“egon”年龄,他说比“小大”大5岁,“小大”又说比“小保 ...

  3. mysql 修改配置文件my.cnf失败

    一.连接Mysql提示无法通过socket的解决方法连接到本地MySQL服务器 http://www.aiezu.com/db/mysql_cant_connect_through_socket.ht ...

  4. CF919F

    题意: Alice和Bob玩游戏,每人各有8张牌,牌的大小在0~4之间 每次操作,先手可以选择自己一张牌和对方一张牌求和后%5,将新的牌替代自己拿出的那张牌,以此类推,直到有一个人手中的牌全部是0,则 ...

  5. spring cloud Config--server

    概述 使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同,因此它们与Spr ...

  6. 使用powerdesigner导入sql脚本,生成物理模型

    有些时候我们的powerdesigner以jdbc的形式链接本地数据库可能会失败,这时候我觉得从sql文件中生成物理模型是个很不错的方法 1.打开powerdesigner,文件->->r ...

  7. 20165206 实验一 Java开发环境的熟悉

    20165206 实验一 Java开发环境的熟悉 一.实验内容及步骤 实验一 Java开发环境的熟悉-1 建立有自己学号的实验目录. 通过vim Hello.java编辑代码. 编译.运行Hello. ...

  8. 转: 解压Assets.car (iOS加密资源)

    今天想获取APP的资源,但是查看xxx.app文件夹里面,缺少了大部分资源.在文件夹里面发现Assets.car这个文件,发现文件很大有40多M,猜想图片资源会不会被压缩到这里面了,所以就网络上查了下 ...

  9. Not running in a hosted service or the Development Fabric

    今天尝试在azure上发布网站后,无法正常访问 本地调试也提示: Not running in a hosted service or the Development Fabric 谷歌百度半天… 最 ...

  10. What's news in Visual Studio 2017

    文字总结: 1.高级智能提示  在属性列表中输入 M C即可查询属性中包含字母m\c的属性 2.更快的导航查询,在Go To All中输入任意查询的字符,可快速查到任何包含关键字的文件 3.代码智能分 ...