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. Flask的蓝图和红图

    1.蓝图 对于简单的项目来说,比如项目就只有一个user模块,我们可以都将视图函数定义在一个文件里面,不需要用到蓝图. 但是如果我们的项目有多个模块,如下有v1模块,v2模块.....等,那么如果我们 ...

  2. 搜狐畅游一面(c++)

    上来是个小姐姐,有点懵.. 1.  介绍 2.  项目 3.  实习 4.  用的协议 tcp和udp的协议 5.  select 和epoll(忘了) 6. 数据库的隔离级别, 死锁, 怎么避免死锁 ...

  3. Day15 Python基础之logging模块(十三)

    参考源:http://www.cnblogs.com/yuanchenqi/articles/5732581.html logging模块 (****重点***) 一 (简单应用) import lo ...

  4. 使用Vue自己做一个简单的MarkDown在线编辑器

    1.首先要下载mark组件. npm install marked --save 2.在Vcontent.vue中简单写一些样式. <template> <div class=&qu ...

  5. JavaScript中防止重复提交

    有这么一种情况: 页面有一个按钮,点击之后会触发Ajax请求,但是用户在点击之后,不知道是否点成功了,于是又点了一下,如果不加处理的话,就会进行两次Ajax请求,并且请求的数据都是一样的,对后端的程序 ...

  6. Python爬虫——用BeautifulSoup、python-docx爬取廖雪峰大大的教程为word文档

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 廖雪峰大大贡献的教程写的不错,写了个爬虫把教程保存为word文件,供大家方便下载学习:http://p ...

  7. JS 验证输入框输入 只允许输入正实数(正整数,正小数),其他情况下不能输入 oninput事件

    input标签的oninput事件 要求输入框只输入正实数,包括整数和小数. 具体要求:整数部分不超过7位,可以没有小数,若有位数不超过2位. <input type="text&qu ...

  8. 【学亮IT手记】使用Map代替switch...case语句

  9. Oracle转换函数

    ()--转换函数 --数字转换字符串 )||'分' from dual; ||'' from dual; ()--日期转字符串 select to_char(sysdate,'yyyy-mm-dd') ...

  10. 【学亮开讲】Oracle存储过程教学笔记(一)20181115

    --创建业主序列起始值为11 ; --不带传出参数的存储过程 create or replace procedure pro_owners_add ( v_name varchar2,--名称 v_a ...