dp(动态规划)顾名思义便是动态的一种规划,而这种规划往往会跟状态,状态转移方程,记忆化搜索扯上关系,当然DP也是各个OI考试的必考点和常考点,在毒瘤出题人的折磨下,出现了许许多多的动态规划,有线性,背包,环形,插头,区间,数位,状压等等各种动态规划,最近刚刚吧区间和数位DP学会。

区间DP:一看就知道肯定与区间有关,这类DP主要处理一些区间的最值和各种状态,貌似ST表就相当于区间DP,说到区间DP,就不得不提一个题——石子合并。

题目

我们乍一看似乎可以贪心,但是这个题跟合并果子可是万万不同,合并果子是一道堆,而这道题还是环形,因此我们看题一定要看清楚,不然就会GG。我们要先化环为链。

我们难道做DP就要先想这是什么DP吗,错了,我们一定要先想状态和状态转移方程,慢慢慢慢就会知道这是什么DP了。再看这道题,我们先处理前缀和,这样好控制一段区间里的所有石子的值,到合并时,肯定要加上这段区间里的所有值,因此我们要处理前缀和,方便合并。

这样的话我们可以轻易的写出状态转移方程:

    dp1[i][j]=min(dp1[i][j],dp1[i][k]+dp1[k+][j]+sum[j]-sum[i-]);//最小值
dp2[i][j]=max(dp2[i][j],dp2[i][k]+dp2[k+][j]+sum[j]-sum[i-]);//最大值

看这个状态转移方程,如果你写出了状态转移方程也不要大意,我们看i表示左端点,而j表示右端点,k表示中间断点。而显而易见,k一定>i,<j.

又因为原状态转移方程中出现了k+1,所以我们应该在枚举的时候,让i从2*n-1到1。

这样这个题就很好写了。

代码:

#include<iostream>
#include<cstdio>
using namespace std;
int n,minn=0x7ffffff,maxn;
int data[],dp1[][],dp2[][],sum[];//sum表示前缀和,dp1,dp2,分别表示最大最小值。
int main()
{ cin>>n;
for(int i=;i<=n;i++)
{
cin>>data[i];
data[i+n]=data[i];//环形
}
for(int i=;i<=n*;i++)
sum[i]=sum[i-]+data[i];
for(int i=n*-;i>;i--)//因为是环形,所以要从n*2-1开始
{
for(int j=i+;j<i+n;j++)
{
dp1[i][j]=0x3f3f3f;
for(int k=i;k<j;k++)
{
dp1[i][j]=min(dp1[i][j],dp1[i][k]+dp1[k+][j]+sum[j]-sum[i-]);
dp2[i][j]=max(dp2[i][j],dp2[i][k]+dp2[k+][j]+sum[j]-sum[i-]);
}
}
}
for(int i=;i<=n;i++)
{
minn=min(minn,dp1[i][i+n-]);
maxn=max(maxn,dp2[i][i+n-]);
}
printf("%d\n%d\n",minn,maxn);
return ;
}

这个题也是一道很经典的题了,从此我们可以得出区间DP的一个普遍规律(仅供参考,每个DP都不一样,所以不要照着葫芦画葫芦)。

我们要先枚举左端点,然后枚举区间长度或右端点,然后枚举中间断点用于状态转移方程。

数位DP:

不得不说数位DP还是挺难的,到底有多难呢,NOIP不考(为了长远打算)

https://wenku.baidu.com/view/9de41d51168884868662d623.html

数位DP的题目特点是让你求一段区间内的满足一个特点的数的个数,我们首先看这些数有什么特点,然后枚举看这个数的第一位是否<=他给出的条件,如果满足就可以,如果第一位恰好在边界上,那我们就不能随便枚举了,这时候我们就应该再判断下一位,这样依次判断直到满足或不满足。

区间DP,数位DP的更多相关文章

  1. [DP]数位DP总结

     数位DP总结 By Wine93 2013.7 1.学习链接 [数位DP] Step by Step   http://blog.csdn.net/dslovemz/article/details/ ...

  2. 【xsy1611】 数位dp 数位dp

    这题是显然的数位$dp$,然而我居然写了一个下午!!! 我们不难想到差分,令$solve(x,y)$表示从第一个数字在区间$[0,x]$,第二个数字在区间$[0,y]$的答案. 不难发现题目中给了你一 ...

  3. hdu4352-XHXJ's LIS状压DP+数位DP

    (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 题意:传送门  原题目描述在最下面.  在区间内把整数看成一个阿拉伯数字的集合,此集合中最长严格上升子序列的长度为k的个数. 思路: ...

  4. 数位dp模板 [dp][数位dp]

    现在才想到要学数位dp,我是不是很弱 答案是肯定的 以一道自己瞎掰的题为模板 //题: //输入数字n //从0枚举到n,计算这n+1个数中含有两位数a的数的个数 //如12930含有两位数93 #i ...

  5. Codeforces Round #235 (Div. 2) D. Roman and Numbers 状压dp+数位dp

    题目链接: http://codeforces.com/problemset/problem/401/D D. Roman and Numbers time limit per test4 secon ...

  6. luogu P4798 [CEOI2015 Day1]卡尔文球锦标赛 dp 数位dp

    LINK:卡尔文球锦标赛 可以先思考一下合法的序列长什么样子. 可以发现后面的选手可以使用前面出现的编号也可以直接自己新建一个队. 其实有在任意时刻i 序列的mex>max.即要其前缀子序列中1 ...

  7. 浅谈数位DP

    在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...

  8. 数位dp 的简单入门

    时间紧张,就不讲那么详细了. 之前一直被深搜代码误解,以为数位dp 其实就是记忆化深搜...(虽说爆搜确实很舒服而且还好想) 但是后来发现数位dp 的标准格式其实是 预处理 + dp ...... 数 ...

  9. 【距离GDOI:141天】 滚入数位DP的坑

    作为博客园的第一篇...我都不知道要写什么了 ... 其实今天很没状态,就当吐槽吧... 嗯,被黄神带去写treap+可持久化线段树,然后在可持久化的删除上面跪了两天,真的是一跪不起.我已经连续多久没 ...

随机推荐

  1. 朱晔和你聊Spring系列S1E1:聊聊Spring家族的几大件

    朱晔和你聊Spring系列S1E1:聊聊Spring家族的几大件 [下载本文PDF进行阅读] Spring家族很庞大,从最早先出现的服务于企业级程序开发的Core.安全方面的Security.到后来的 ...

  2. iOS数据存储-钥匙串存储

    2017.11.20 14:41* 字数 227 阅读 678评论 0喜欢 0 钥匙串介绍   1. 表示设备唯一号的标识,在IOS7中要么被禁止使用,要么重新安装程序后两次获取的标识符不一样. 2. ...

  3. Eclipse External Tool Configration Notepad++

    Location: C:\Program Files\Notepad++\notepad++.exe Arguments: ${resource_loc}

  4. h5-语义化标签

    ###1.语义化标签 在h5之前,在开发过程中大量div的id名称重复,例如div id="footer"来标记页脚内容,所以html5元素引入了语义化标签(一组新的片段类元素)  ...

  5. 通过event记录sql

    providers EventServiceProvider.php 添加 protected $listen = [ 'Illuminate\Database\Events\QueryExecute ...

  6. Oracle 不小心删除undo数据文件以及磁盘空间不足导致不能登录的解决办法

    在一次测试中,由于导入的数据量过大导致事务一直提交失败因为磁盘空间不够用了,一检查发现是undo表空间不够用,于是重新创建了一个表空间,准备把之前的undo表空间删除,删除时却发现一直删不掉,因为它一 ...

  7. [转帖]Windows批处理(cmd/bat)常用命令小结

    Windows批处理(cmd/bat)常用命令小结 非常值得学习的文档 先放这里 有时间做实验, 转载自:“趣IT”微信公共号 前言 批处理文件(batch file)包含一系列 DOS命令,通常用于 ...

  8. CentOS7安装Jenkins自动化部署maven项目

    前言: 最近要弄一个jenkins工具,已经安装好了并且jenkins使用部署项目的流程已经基本走通,上图: 话不多说,开始 第一步:安装jenkins: [ 准备环境: 在centOS7环境上:安装 ...

  9. (二)类数组对象HTMLCollection

    HTMLCollection 表示 HTML 元素的集合. 下面的几种方式将返回 HTMLCollection对象: html: <body> <ul id="box&qu ...

  10. python爬虫之git的使用(coding.net的使用)

    1.注册coding.net账号,然后登陆. 2.创建项目 套路和github都一样. 1.1.我们在远程仓库上创建了一个仓库,这样的话,我们需要在本地随便建立一个文件普通文件夹,进去以后,执行git ...