怎么办,膜你赛要挂惨了,下午我还在学区间\(dp\)!

不管怎么样,计划不能打乱\(4\)不\(4\)。。

区间dp

模板

为啥我一开始就先弄模板呢?因为这东西看模板就能看懂。。。

for(int i=2;i<=len;i++)//枚举区间长度
{
for(int l=1,r=l+len-1;r<=n;l++,r++)//枚举左端点和右端点
{
//以下你可以搞一下事情
for(int k=l;k<r;k++)
{
//以下你还可以搞一下事情
dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]);
}
}
}

以上就是区间dp的大体模板,至于为啥,感性理解一下就好了

例题

石子合并加强版

为啥我一开始就弄加强版呢?因为普通版就在加强版里面哇\(qwq\)

传送门

这道题目是说一个环形操场,然后合并成一堆的最大值最小值

注意加粗的字体,环形操场?

好吧,这就是一个环形\(dp\),通常的就是复制一遍,断环为链,别问我为啥是这样

然后就是状态转移方程。\(dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r])\)与\(dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r])\)

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int N = 1000;
int n,a[1000],dpmax[N][N],dpmin[N][N],sum[N];
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]),a[i+n]=a[i];
for(int i=1; i<=n*2; i++)
sum[i]=sum[i-1]+a[i];
memset(dpmin,0x3f,sizeof(dpmin));
for(int i=1; i<=n*2; i++)dpmin[i][i]=0;
for(int len=2; len<=n; len++)
{
for(int l=1,r=len+l-1; r<=n*2; l++,r++)
{
for(int k=l; k<r; k++)
dpmax[l][r]=max(dpmax[l][r],dpmax[l][k]+dpmax[k+1][r]+sum[r]-sum[l-1])
,dpmin[l][r]=min(dpmin[l][r],dpmin[l][k]+dpmin[k+1][r]+sum[r]-sum[l-1]);
}
}
int maxn=0,minn=0x7fffffff;
for(int i=1; i<=n; i++)minn=min(minn,dpmin[i][i+n-1]),maxn=max(maxn,dpmax[i][i+n-1]);
cout<<minn<<endl<<maxn;
}

括号匹配问题

传送门

这道题也是\(dp\)问题,不算特别的裸,毕竟用到了字符串。

因为我们要判断括号的合法性,所以我们在枚举左端点和右端点的时候,只要合法,括号序列就\(+2\),也就是\(dp[l][r]=dp[l+1][r-1]+2\)这个看不懂的人不多吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
char s[255];
int dp[300][300];
int main()
{
while(1)
{
cin >> s+1;
if(s[1]=='e')break;
memset(dp,0,sizeof(dp));
int len=strlen(s+1);
for(int i=2; i<=len; i++)
{
for(int l=1,r=i+l-1; r<=len; l++,r++)
{
if((s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']'))
dp[l][r]=dp[l+1][r-1]+2;
for(int k=l; k<r; k++)
{
dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]);
}
}
}
printf("%d\n",dp[1][len]);
}
}

关于区间\(dp\)还有一个东西叫做四边形不等式优化,\(emmm\)这东西以后再学

区间dp学习笔记的更多相关文章

  1. 区间DP 学习笔记

    前言:本人是个DP蒟蒻,一直以来都特别害怕DP,终于鼓起勇气做了几道DP题,发现也没想象中的那么难?(又要被DP大神吊打了呜呜呜. ----------------------- 首先,区间DP是什么 ...

  2. 数位DP学习笔记

    数位DP学习笔记 什么是数位DP? 数位DP比较经典的题目是在数字Li和Ri之间求有多少个满足X性质的数,显然对于所有的题目都可以这样得到一些暴力的分数 我们称之为朴素算法: for(int i=l_ ...

  3. DP学习笔记

    DP学习笔记 可是记下来有什么用呢?我又不会 笨蛋你以后就会了 完全背包问题 先理解初始的DP方程: void solve() { for(int i=0;i<;i++) for(int j=0 ...

  4. 树形DP 学习笔记

    树形DP学习笔记 ps: 本文内容与蓝书一致 树的重心 概念: 一颗树中的一个节点其最大子树的节点树最小 解法:对与每个节点求他儿子的\(size\) ,上方子树的节点个数为\(n-size_u\) ...

  5. 斜率优化DP学习笔记

    先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...

  6. 区间DP学习总结

    这段时间学习了区间DP,所以试着把学到的东西稍作总结,以备不时之需. 学习区间DP首先要弄清区间DP是为了解决什么问题:一般的DP主要是特征是一次往往只操作一个数值或者存储可以不连续的物品的状态(比如 ...

  7. dp学习笔记(各种dp,比较杂)

    HDU1176 中文题意不多解释了. 建一个二维dp数组,dp[ i ][ j ]表示第 i 秒落在 j 处一个馅饼.我们需要倒着DP,为什么呢,从 0秒,x=5处出发,假如沿数组正着往下走,终点到哪 ...

  8. 动态 DP 学习笔记

    不得不承认,去年提高组 D2T3 对动态 DP 起到了良好的普及效果. 动态 DP 主要用于解决一类问题.这类问题一般原本都是较为简单的树上 DP 问题,但是被套上了丧心病狂的修改点权的操作.举个例子 ...

  9. [总结] 动态DP学习笔记

    学习了一下动态DP 问题的来源: 给定一棵 \(n\) 个节点的树,点有点权,有 \(m\) 次修改单点点权的操作,回答每次操作之后的最大带权独立集大小. 首先一个显然的 \(O(nm)\) 的做法就 ...

随机推荐

  1. hdu_2191多重背包

    用二维数组解的,因为忘了memset害我wa了好几发... #include<iostream> #include<cstdio> #include<cstring> ...

  2. CENTOS修改操作系统字符集

    [root@localhost sysconfig]# cd /etc/sysconfig/ [root@localhost sysconfig]# vi i18n 修改并保存退出(:wq) LANG ...

  3. .net中MVC Webapi多参数调用控制器方法

    http://blog.csdn.net/wulex/article/details/71545471 路由 public static void Register(HttpConfiguration ...

  4. 简易的CSS下拉菜单 - 1

    <!DOCTYPE html> <html> <head> <style> body{ margin:0; } .dropmenu{ backgroun ...

  5. 如何在SQLServer中处理每天四亿三千万记录的

    项目背景 这是给某数据中心做的一个项目,项目难度之大令人发指,这个项目真正的让我感觉到了,商场如战场,而我只是其中的一个小兵,太多的战术,太多的高层之间的较量,太多的内幕了.具体这个项目的情况,我有空 ...

  6. STM8S103-STVD建立汇编代码项目

    转载:http://blog.csdn.net/u010093140/article/details/49983397 STVD本来就比较少人用,STVD汇编就更少人用了,不过STM8汇编我自己还是满 ...

  7. shell脚本执行的三种方式

    (1)  bash script_name 或 sh script_name    推荐使用此方法,script_name 不需要执行权限亦可执行.   (2) path/script_name 或 ...

  8. 我的Java历程_写出这个数

    lzJava基础进行中,今天偶然间看到的一个题目: 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字.如下代码: import java.util.*;public class Ma ...

  9. 优动漫PAINT-百褶裙绘制教程

    不论是萌系水手服还是洋气学院风,一定少不了百褶裙的绘制.不同的群褶,会呈现不同的视觉效果.裙褶的结构在舒展和重叠的时候也存在不一样的绘制技巧.让我们一起通过这篇教程,看看百褶裙是如何绘制的吧~ 作者: ...

  10. Python内置数据结构之列表list

    1. Python的数据类型简介 数据结构是以某种方式(如通过编号)组合起来的数据元素(如数.字符乃至其他数据结构)集合.在Python中,最基本的数据结构为序列(sequence). Python内 ...