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. ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList 区别缺点

    ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含 ...

  2. Codeup 25609 Problem I 习题5-10 分数序列求和

    题目描述 有如下分数序列 2/1,3/2,5/3,8/5,13/8,21/13 - 求出次数列的前20项之和. 请将结果的数据类型定义为double类型. 输入 无 输出 小数点后保留6位小数,末尾输 ...

  3. 012-C语言小游戏之推箱子

    012-C语言小游戏之推箱子 一.创建游戏地图   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #define ROWS 11 #define COLS 12   char ...

  4. SpringBoot实现图片上传demo&Nginx进行代理显示

    公司项目需要一个图片上传的功能,就图片能上传到服务器(公司用的windows服务器),然后nginx能进行代理访问到就行了,先简单介绍一下nginx,然后再来实现功能. 一.nginx简介 Nginx ...

  5. python的pip怎样更新包 + pip的help翻译

    1.pip下载安装 pip下载 进入https://pypi.python.org/pypi/pip,下载 .tar.gz压缩包 Linux安装pip # tar -xzvf pip-1.5.4.ta ...

  6. 1196F - K-th Path

    题目链接: http://codeforces.com/problemset/problem/1196/F 题目大意::无向图,求任意两点第k短的路径 思路:按照边的大小,只保留前K个边,如果不连同的 ...

  7. jdk动态代理:由浅入深理解mybatis底层

    什么是代理 代理模式,目的就是为其他对象提供一个代理以控制对某个对象的访问,代理类为被代理者处理过滤消息,说白了就是对被代理者的方法进行增强. 看到这里,有没有感觉很熟悉?AOP,我们熟知的面向切面编 ...

  8. 详解PHP反序列化中的字符逃逸

    首发先知社区,https://xz.aliyun.com/t/6718/ PHP 反序列化字符逃逸 下述所有测试均在 php 7.1.13 nts 下完成 先说几个特性,PHP 在反序列化时,对类中不 ...

  9. Blazor WebAssembly 3.2.0 已在塔架就位 将发射新一代前端SPA框架

    最美人间四月天,春光不负赶路人.在充满无限希望的明媚春天里,一路风雨兼程的.NET团队正奋力实现新的突破. 根据计划,新一代基于WebAssembly 技术研发的前端SPA框架Blazor 将于5月1 ...

  10. sk-learn实现L2岭回归,对线性回归正则化

    岭回归算法: from sklearn.datasets import load_boston from sklearn.externals import joblib from sklearn.li ...