【区间dp让人头痛……还是要多写些题目练手,抽空写篇博客总结一下】


这题区间dp入门题,理解区间dp或者练手都很妙

——题目链接——

(或者直接看下面)

题面

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

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

范围:1≤N≤100

分析

这个范围……感受到快乐了吗?

一般这种范围复杂度都超高哦~

这题是区间DP,我想看标题就知道了,如果没有学过区间DP的话……就先学吧(这个坑可能我得好久好久好久以后填)

这题四舍五入就是个模板(?)了

难点在于它是个环,不过处理起来难度也不大

我们把这个环破开复制一遍,那么它会成为一条链,就会便于 处理啦

在这个 2*n (复制过一遍)的数组上枚举 1~n 的区间就能得到这个环能组成的所有区间

然后就是区间DP的实现过程!(不懂试着看看代码,再不懂就找找博客 / 老师学一学)

转移方程式:

dpmax[j][ends]=max(dpmax[j][ends],dpmax[j][i]+dpmax[i+1][ends]+stone[ends]-stone[j-1]);
dpmin[j][ends]=min(dpmin[j][ends],dpmin[j][i]+dpmin[i+1][ends]+stone[ends]-stone[j-1]);

【 j 和 ends 是目前区间左右端点, i 是枚举的 j~ends 里的一点,用于断开区间更新dp数组】

【 stone 数组记录整段区间前缀和,便于统计数据; dpmax 和 dpmin 看名字估计也知道是干什么了吧】

放一张AC图(悄咪咪地)我知道我很菜鸡你们自己考虑看不看下面参考

代码参考

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,a[],stone[];
int dpmax[][];
int dpmin[][];
int main()
{
cin>>n;
for (int i=; i<=n; i++)
{
cin>>a[i];
}
memset(dpmax,-,sizeof(dpmax));
memset(dpmin,0x3f3f3f,sizeof(dpmin));
memset(stone,,sizeof(stone));
for (int i=; i<=n; i++)
{
stone[i]=stone[i-]+a[i];
dpmax[i][i]=;
dpmin[i][i]=;
}
for (int i=; i<=n; i++)
{
stone[i+n]=stone[i+n-]+a[i];
//stone记录前缀和,用前缀和处理比较轻松
dpmax[i+n][i+n]=;
dpmin[i+n][i+n]=;
}
//读入与初始化
for (int len=; len<=n; len++)
//len枚举区间长度
for (int j=; j+len<=*n; j++)
//j枚举区间左端点
{
int ends=j+len-;
//区间右端点
for (int i=j; i<ends; i++)
//枚举分割点
{
dpmax[j][ends]=max(dpmax[j][ends],dpmax[j][i]+dpmax[i+][ends]+stone[ends]-stone[j-]);
dpmin[j][ends]=min(dpmin[j][ends],dpmin[j][i]+dpmin[i+][ends]+stone[ends]-stone[j-]);
}
}//核心代码!!!状态转移
int ansmin=0x3f3f3f;
int ansmax=-;
for (int i=; i<=*n; i++)
{
ansmin=min(ansmin,dpmin[i][i+n-]);
//i+n-1刚好是每种区间,超级妙的思路
ansmax=max(ansmax,dpmax[i][i+n-]);
}
cout<<ansmin<<endl<<ansmax;
return ;
}
——撒花!!!!——

我是在网上找博客学的区间DP,大概是有部分参考

—>https://blog.csdn.net/qq_40772692/article/details/80183248

有问题欢迎大佬指正

到这里就结束了,感谢看完

ありがとうございます

石子合并2——区间DP【洛谷P1880题解】的更多相关文章

  1. 洛谷P1880题解

    题目 第一类区间DP模板题. 所谓第一类区间DP,是指合并型区间DP,状态转移方程一般形如 \(f_{i,j}=\max{f_{i,k}+f_{k+1,j}+cost_{i,j}}\) ,时间复杂度一 ...

  2. 洛谷P1880 石子合并(区间DP)(环形DP)

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

  3. 经典DP 洛谷p1880 石子合并

    https://www.luogu.org/problemnew/show/P1880 题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新 ...

  4. P1880 [NOI1995]石子合并【区间DP】

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

  5. 直线石子合并(区间DP)

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

  6. CH5301 石子合并【区间dp】

    5301 石子合并 0x50「动态规划」例题 描述 设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=300).每堆沙子有一定的数量,可以用一个整数来描述,现在要将这N堆沙子合并成为一堆, ...

  7. zjnu 1181 石子合并(区间DP)

    Description 在操场上沿一直线排列着 n堆石子. 现要将石子有次序地合并成一堆.规定每次仅仅能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分.同意在第一次合并前对调一 ...

  8. nyoj 737 石子合并(区间DP)

    737-石子合并(一) 内存限制:64MB 时间限制:1000ms 特判: No通过数:28 提交数:35 难度:3 题目描述:     有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为 ...

  9. nyoj 737 石子合并 经典区间 dp

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

随机推荐

  1. Noip2016 提高组 Day1

    T1 玩具迷题 直通 思路: 1.首先根据数据范围来看,储存小人的姓名开一个二维char数组即可(不会开爆) 2.然后看他给出的样例以及条件什么的,能够确定出 ①朝内向右,朝外向左均为+ ②朝内向左, ...

  2. 【csp模拟赛5】加减法--宽搜维护联通快

    题目大意: 一开始想用并查集,发现很难维护联通块的代表元素,所以用了宽搜,开数组会炸,所以开一个优先队列维护,每扫完一个联通块,统计答案,清空优先队列,!!千万记住注意数组的大小!!! 代码: #in ...

  3. 《30天自制操作系统》学习笔记--Mac下工具的使用

    现在来介绍官网上下的工具怎么用首先是官网地址,书上有个注释上有:hrb.osask.jp 翻译成中文大概是这个样子滴. 上面有两个文件可以下载,一个是工具,一个是工具的源代码,很好的学习资料 下面把工 ...

  4. Java并发之同步工具类

    1. CountDownlatch(计数器) 描述: 一个同步工具类,允许一个或多个线程等待其它线程完成操作 类图 通过指定的count值进行初始化,调用await方法的线程将被阻塞,直到count值 ...

  5. 【分类模型评判指标 二】ROC曲线与AUC面积

    转自:https://blog.csdn.net/Orange_Spotty_Cat/article/details/80499031 略有改动,仅供个人学习使用 简介 ROC曲线与AUC面积均是用来 ...

  6. 【零基础】一文读懂CPU(从二极管到超大规模集成电路)

    一.前言 我们都知道芯片,也知道芯片技术在21世纪是最重要的技术之一,但很少有人能知道芯片技术的一些细节,如芯片是如何构造的.为什么它可以运行程序.芯片又是如何被设计制造出来的等等.本文就尝试从最底层 ...

  7. MySort(选做)

    一.题目要求 注意:研究sort的其他功能,要能改的动代码,需要答辩 模拟实现Linux下Sort -t : -k 2的功能. 要有伪代码,产品代码,测试代码(注意测试用例的设计) 参考 Sort的实 ...

  8. 指定pip清华源

    临时指定: pip install cefpython3 -i https://pypi.tuna.tsinghua.edu.cn/simple 一直使用:pip的配置文件为%HOME%/pip/pi ...

  9. Java并发包concurrent——ConcurrentHashMap

    转: Java并发包concurrent——ConcurrentHashMap 2018年07月19日 20:43:23 Bill_Xiang_ 阅读数 16390更多 所属专栏: Java Conc ...

  10. Linux命令集锦:ansible命令

    ansible 命令主要用于批量管理,来实现自动化管理.常用批量操作包括:主机分组管理.实时批量执行命令或脚本.实时批量分发文件或目录.定时同步文件等. 一.安装 ansible yum instal ...