D - 石子合并问题--直线版 
HRBUST - 1818

这个题目是一个区间dp的入门,写完这个题目对于区间dp有那么一点点的感觉,不过还是不太会。

注意这个区间dp的定义

dp[i][j] 表示的应该是将连续的从 i 到第 j 堆的石块进行合并的最大值(或者最小值)

知道这个定义就很好求了,所以我们每次都要先枚举这个区间的长度,然后就是枚举这个区间的起点,然后就是枚举分段点。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <algorithm>
#define pi acos(-1)
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = ;
int dpmax[maxn][maxn], dpmin[maxn][maxn];
int stone[maxn];
int sum[maxn];
int main() {
int n;
while (scanf("%d", &n)!=EOF) {
memset(dpmin, inf, sizeof(dpmin));
memset(dpmax, -inf, sizeof(dpmax));
memset(sum, , sizeof(sum));
for (int i = ; i <= n; i++) {
scanf("%d", &stone[i]);
sum[i] = sum[i - ] + stone[i];
dpmax[i][i] = ;
dpmin[i][i] = ;
}
for (int i = ; i <= n; i++) {
for (int j = ; j + i <= n + ; j++) {
int ends = j + i - ;
for (int k = j; k < ends; k++) {
dpmin[j][ends] = min(dpmin[j][ends], dpmin[j][k] + dpmin[k + ][ends] + sum[ends] - sum[j - ]);
dpmax[j][ends] = max(dpmax[j][ends], dpmax[j][k] + dpmax[k + ][ends] + sum[ends] - sum[j - ]);
}
}
}
printf("%d %d\n", dpmin[][n], dpmax[][n]);
}
return ;
}

区间dp入门

D. XOR-pyramid

这个要是把题目看清楚了+看了一点点的题解就很简单了。

这个题目需要对题目进行一部分处理,推荐学长博客https://blog.csdn.net/qq_39599067/article/details/80335949

学长博客讲的很清楚了。

我说一下我的理解吧,f[i][j]表示从i到j的异或和,dp[i][j]表示从i到j的最大的异或和

因为f[i][j]=f[i][j+1]^f[i+1][j]

所以这个dp就很好转移了 dp[i][j]=max(f[i][j],max(dp[i][j-1],dp[i+1][j])

这个转移方程我觉得还比较难理解,对于dp[i][j] 应该是由三个状态转移过来的,一个是本身的异或和,一个不包括左端点的最大值,一个是不包括右端点的最大值,

这个可以去看学长的那个图。

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 5e3 + ;
int dp[maxn][maxn], f[maxn][maxn]; int main()
{
int n;
scanf("%d", &n);
for(int i=;i<=n;i++)
{
scanf("%d", &dp[i][i]);
f[i][i] = dp[i][i];
}
for(int i=;i<=n;i++)
{
for(int j=;j+i<=n;j++)
{
f[j][j + i] = f[j][j + i - ] ^ f[j + ][j + i];
}
}
for(int i=;i<=n;i++)
{
for(int j=;j+i<=n;j++)
{
dp[j][j + i] = max(f[j][i + j], max(dp[j][j + i - ], dp[j + ][j + i]));
}
}
int q;
scanf("%d", &q);
while(q--)
{
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", dp[l][r]);
}
return ;
}

区间dp

B - Halloween Costumes

这个题目我觉得还是一个比较难的区间dp,相对于这个之前可以说算是裸题了。

这个我看了题解之后,按照题解的思路去敲代码,推荐博客:https://www.cnblogs.com/DOLFAMINGO/p/7927432.html

他是把这个题目进行了一定的转化,转化成了涂色,就是把给定一个区间,每次可以为一段连续的子区间刷一种颜色。问最少需要刷多少次,能得到目标的区间。

该题解对左端点进行讨论,这个算是一个切入点吧,因为对于左端点和右端点进行讨论应该都是可以的,但是对于左端点会更加简单一些。

怎么对左端点进行讨论呢

我的理解:

预处理就是假设每一个都是要涂成不一样的颜色

这个应该是理解为先涂成目标这样子,然后去判断涂了多少层。

对左端点进行考虑。

先假设左端点涂的是一种新颜色。

所以dp[i][j]=dp[i+1][j]+1;

然后去判断这个区间有没有和它一样的颜色,如果有的话,他们应该是同一个时刻涂的,

所以就暂时忽略它,以这个点为分段点对该点左右颜色总和加起来 去最小。

其实看了题解理解我觉得还是挺难的,能想到的人,我感觉挺变态的。

#include <cstdio>
#include <cstdlib>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e2 + ;
int dp[maxn][maxn];
int a[maxn];
int main()
{
int t;
scanf("%d", &t);
for(int cas=;cas<=t;cas++)
{
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) scanf("%d", &a[i]);
memset(dp, , sizeof(dp));
for (int i = ; i <= n; i++) dp[i][i] = ;
for(int i=;i<=n;i++)
{
for(int j=;j+i-<=n;j++)
{
int ends = i + j - ;
dp[j][ends] = dp[j + ][ends] + ;
for(int k=j+;k<=ends;k++)
{
if(a[j]==a[k])
{
dp[j][ends] = min(dp[j][ends], dp[j][k - ] + dp[k + ][ends]);
}
}
}
}
printf("Case %d: %d\n",cas, dp[][n]);
}
return ;
}

区间dp

H - String painter

来写这个题目,如果你解决了上面的这个题目,那么这个就变得很简单了,

从上面得题目我们知道了怎么去把一个空白字符串涂成我们想要的字符串。

现在我们是把一个已知的字符串涂成我们想要的,这个怎么写呢?

这个应该是去枚举每一位的字符,如果这个字符和所求的字符相同就不需要再涂了,

但是如果不一样就需要给它重新涂色,这个涂色可不是简单的加上一个颜色,

而是要从整体的角度去看如何给她涂色最优,所以我们要枚举这个和这个之前的每一个位置来判断最优。

区间dp

区间dp 例题的更多相关文章

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

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

  2. 区间dp(模板+例题)

    参考博文:区间dp小结(附经典例题) 首先,什么是区间dp?它是干什么的? 先在小区间进行DP得到最优解,然后再利用小区间的最优解合并求大区间的最优解 操作往往涉及到区间合并问题 以上. 模板如下: ...

  3. 区间dp入门+例题

    区间dp作为线性dp的一种,顾名思义是以区间作为阶段进行dp的,使用它的左右端点描述每个维度,决策往往是从小状态向大状态转移中推得的.它跟st表等树状结构有着相似的原理---向下划分,向上递推. dp ...

  4. 紫书 例题 9-9 UVa 10003 (区间dp+递推顺序)

    区间dp,可以以一个区间为状态,f[i][j]是第i个切点到第j个切点的木棍的最小费用 那么对于当前这一个区间,枚举切点k, 可以得出f[i][j] = min{dp(i, k) + dp(k, j) ...

  5. 区间dp的典例

    区间dp, 属于dp的一种,顾名思义,便是对区间处理的dp,其中石子归并,括号匹配,整数划分最为典型. (1)石子归并 dp三要素:阶段,状态,决策. 首先我们从第i堆石子到第j堆石子合并所花费的最小 ...

  6. LightOJ1033 Generating Palindromes(区间DP/LCS)

    题目要计算一个字符串最少添加几个字符使其成为回文串. 一年多前,我LCS这道经典DP例题看得还一知半解时遇到一样的问题,http://acm.fafu.edu.cn/problem.php?id=10 ...

  7. LightOJ1025 The Specials Menu(区间DP)

    给一个字符串,问有几种删字符的方式使删后的非空字符串是个回文串. 当然区间DP:dp[i][j]表示子串stri...strj的方案数 感觉不好转移,可能重复算了.我手算了"AAA" ...

  8. 区间DP(总结)

    学长一晚上的耐心讲解,使我明白区间DP这么高级的东西,还是挺容易的.也就是在一段区间内的动态规划. 下面用例题进行总结. 例题:石子归并. 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石 ...

  9. 区间DP的学习(持续更新)

    例题: 1.Multiplication Puzzle 原题地址:http://poj.org/problem?id=1651 2.Dire Wolf 原题地址:http://acm.split.hd ...

随机推荐

  1. C#多线程(4):进程同步Mutex类

    Mutex 类 构造函数和方法 系统只能运行一个程序的实例 解释一下上面的示例 接替运行 进程同步示例 另外 Mutex 类 Mutex 中文为互斥,Mutex 类叫做互斥锁.它还可用于进程间同步的同 ...

  2. 多线程设置flag标志位实现同步

    信号灯解决同步问题 我尽量注释了代码,可以很容易理解了. package Thread; /** * 信号灯 * 借助标志位 */ public class FlagThread { public s ...

  3. stand up meeting 12/10/2015

    part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 修改了详细释义的自动换行功能:设计并完成了背景图片的切换功能    6 完成单词释义热度排序    6 PDF Reade ...

  4. NGINX 类漏洞 整理记录

    简单介绍NGINX: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行. 其特点是占有内存少,并发能力强,nginx的并 ...

  5. 模糊字符串匹配:FuzzyWuzzy

    FuzzyWuzzy 模糊字符串匹配,它使用Levenshtein Distance来计算简单易用的包中序列之间的差异. 前置条件 Python 2.7 or higher difflib pytho ...

  6. 随笔之——伪类选择器:nth-child(n) 与 nth-of-type(n)的区别!!!

    话不多说!直接正题!!! 一.E:nth-child(n)///选中父元素中第(n)个元素.若第n个元素为E则选中:若第n个不为E则不选中.n可以为2n(偶数).2n+1(奇数).等... 二.E:n ...

  7. 2019-2020-1 20199326《Linux内核原理与分析》第五周作业

    第五周学习内容 庖丁解牛Linux内核分析第四章:系统调用的三层机制(上) Linux内核分析实验四 学到的一些知识 4.1用户态.内核态.中断 宏观上Linux操作系统的体系架构分为用户态和内核态 ...

  8. 日志分析工具ELK(一)

    一.ELK介绍 1.1 elasticsearch 1.1.1 elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎 ...

  9. 怎么在java中创建一个自定义的collector

    目录 简介 Collector介绍 自定义Collector 总结 怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream的c ...

  10. 怎么将swagger API导出为HTML或者PDF

    文章目录 将swagger API导出为HTML或者PDF 什么是Asciidoc swagger2markup-maven-plugin asciidoctor-maven-plugin 使用命令行 ...