摘要:
数据结构: 并查集模板 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int N=10005; 7 int fa[ 阅读全文
摘要:
先附上T1 不怕噩梦 蚊子最近经常做噩梦,然后就会被吓醒。这可不好。。疯子一直在发愁,然后突然有一天,他发现蚊子其实就是害怕某些事。如果那些事出现在她的梦里,就会害怕。我们可以假定那个害怕的事其实是一个字符串。而她做的梦其实也是一个字符串。 她可以一个晚上一直做梦,所以梦这个字符串会很长,如果其中包 阅读全文
摘要:
这题很水 但是他给我们提供了一个很好的思路 两个人相遇时反向行走是不是就相当于这两个人从对方的身体中穿过去了呢? 那么这道题就解决了 是不是很水? 阅读全文
摘要:
现在的题都好难啊 看题 这道题我一开始觉得很简单写了一个小时,发现自己写了一个错的算法 于是看了看题解 发现并没有这么简单 我来讲解一下 看到了m的范围 1<=m<=2 如果m=1,这题就很简单了,就是求k个最大子段和 这里可以分开来讨论 m=1时的dp方程就是 dp[i][j][1]=max(dp 阅读全文
摘要:
这也是一道dp方程很难想出来的dp 要是想通了方程,后续的推导也需要花费一定的时间,所以是一道好题 我直接讲dp方程吧 因为我也没有想出来dp方程,是某个同学告诉我的 dp[i][j][k]表示到了第i行,这一行之前有j列放了1个棋子,有k列放了2个棋子 这个方程确实不好想 转移有一点多 总共有6个 阅读全文
摘要:
同样是一道dp好题,我死也想不出dp方程,看了题解才知道 还是我太蒻了 看看题目描述吧 我们设dp方程dp[i][j],表示前i个人,在1队打饭的总时间为j,吃完饭要花的最小时间 这题有一个小小的贪心,就是要让打饭吃饭慢的人先打饭,这样显然可以保证最优 于是考虑一下转移 dp[i][j]=min(d 阅读全文
摘要:
这是一道dp好题 废话不多说,看看题目意思 这道题又运用了前缀与预处理的思想 我们看着代码来解释 先解释一下各个数组的意思 l[i][j]表示i,j这个点向左拓展能满足条件的最远的点的位置 r[i][j]表示i,j这个点向右拓展能满足条件的最远的点的位置 s[i][j]表示i,j这个点向上拓展能满足 阅读全文
摘要:
我一直觉得这题的题解写的有问题 大多数题解都说他是分组背包 但是我觉得这并不是分组背包,与分组背包有差别 咱们先看看题 题意就是要在不亏本的情况下,使最多的叶子节点看到比赛 咱们来想想这题的思路 这是典型的树形dp 也是我做的第一道树形dp 我们考虑一下dp方程 我们设dp[i][j],表示以i为根 阅读全文
摘要:
一道典型的区间dp题 我一开始做的时候,忘记了之前是怎么写这道题的了 于是翻开之前的代码 回忆起了这题的大致思路 dp[i][j][0/1] 表示i~j区间,0表示老张现在正在区间的i端,1表示老张正在区间的j端 我们想一下怎么转移 肯定是由i+1,j或者i,j-1转移过来的 那么我们只要计算一下除 阅读全文
摘要:
这题太难了,树形dp根本不会 推荐一个树形dp的题解 http://www.cnblogs.com/QWsin/p/5306197.html 附上我抄的代码 阅读全文
摘要:
这是一道dp好题 咱们读读题 题意就是求到达某一点使得两人获取的能量一样 本蒟蒻一开始想了半天都没能把两者能量一样转换成两者差为0 若能这么转换,dp方程就能得出来了 dp[i][j][h][1]=(dp[i][j][h][1]+dp[i-1][j][(h+d[i][j])%k][0])%mod; 阅读全文
摘要:
上题 题目意思很明确,接下来就是考虑这题怎么做了 明显的一道dp题目 而且有很明显的背包的元素,则我们可以考虑dp方程 dp[i]表示在i高度所拥有的生命值 从h~0开始循环 如果这个高度的生命值不小于这个垃圾丢下来的时间 如果 高度+这个垃圾的高度>=d,就输出这个垃圾丢下来的时间 不然 当前高度 阅读全文
摘要:
看题 这显然是一道线性的dp 如何设计状态呢? 看看题目,总共只有4张牌,而且每张牌的个数不超过40 于是状态就很好设计了 方程如下 dp[i][j][k][l]=max(dp[i-1][j][k][l]+d[i*1+j*2+k*3+l*4],dp[i][j][k][l]); dp[i][j][k] 阅读全文
摘要:
看看题目 这题的意思是找一个正方形,使得对角线最长,并且除了对角线上是1,正方形的其他区域都为0 是不是很像P1387 最大正方形这题 我们分析一下 要使这个正方形方向只有对角线上有1其他都为0 我们可以维护一个二维的前缀和来表示某一方向上最长的连续为0的长度 dp方程如下 向右下方斜着的对角线: 阅读全文
摘要:
咱们来看看一个题 洛谷 1855 题目自己看,我就不在这里放了 这里相当于一个有两重限制的01背包 就是既要满足小于1条件,也要小于2条件 代码很简单,加了一维而已 同样是01背包的思路 看看代码就懂了 很简单对吧 阅读全文
摘要:
咱么来看看这道题 题目背景 由于你的帮助,火星只遭受了最小的损失。但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星。不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的食物准备填饱肚子。gw希望能在T时间内做出最美味的食物,但是这些食物美味程度的计算 阅读全文
摘要:
https://www.luogu.org/problemnew/show/P1006 先放题 Description 题意很好理解 我们可以把它转化成这样 甲从原点开始,乙也从原点开始,找两条权值最大的路,两条路不能有重合的部分 方向只能向右或向下 这就是一个多进程的dp 我们可以考虑dp方程了 阅读全文
摘要:
洛谷上的数据比较水,n<=100,所以普通的O(n^3)也能过掉 但是hdu上的数据就比较恶心给力,所以普通的O(n^3)就过不掉了 于是自行百度了一下,找到了平行四边形优化 但是 我还是看不懂 只好把它的适用范围讲一下 直接粘贴好了 四边形不等式优化动态规划原理: 1.当决策代价函数w[i][j] 阅读全文
摘要:
说实话这一题我没想出来,果然是我太蒻了 后来看了看题解才发现,原来这就是一个01背包,其实之前也有往这方面去想,但是没想出来。 不说废话了,咱们看看题目 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点。现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1 阅读全文
摘要:
例题的话,可以看一下洛谷1064 金明的预算方案 原题链接 https://www.luogu.org/problemnew/show/P1064 有依赖性的背包,顾名思义,及选中其中一个物品,另一个物品必须随之选择 题意: 有n个物品,预算为V元,w[i]为每个物品的价格,v[i]为每个物品的重要 阅读全文
摘要:
分组背包其实也不难,弄清楚前面的这里就十分好解决了 有容积为V的背包,有n件物品,每种物品属于的组别不同,t为最大的组数,每组中的物品相互冲突,所以只能选其中一件 接下来是每件物品的重量w[i],价值v[i],以及组号x,求最大的价值 因为每组物品只能选一件,我们很容易把这转化为01背包 显然dp方 阅读全文
摘要:
其实混合背包就更简单了 有n种物品,背包的容量为V,接下来给出每个物品的重量w[i],价值v[i],数量c[i],如果c[i]为0,表示这种物品有无数件,求最大的价值 显然dp方程分为两种 如果是完全背包则是 dp[j]=max(dp[j],dp[j-w[i]]+v[i]) (j=w[i];j<=V 阅读全文
摘要:
这里讲一讲多重背包问题 有n种物品,背包的容量为V,接下来给出每个物品的重量w[i],价值v[i],数量c[i],求最大的价值 有了01背包和完全背包的基础,这里就不难了 显然dp方程为 dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]) (j-k*w[i]>=0 && 0<= 阅读全文
摘要:
我们来讲一讲完全背包 完全背包是有n种物品,每个物品有无限个,背包的重量为V,接下来每个背包重量为w[i],价值为v[i],求最大总价值。 其实这和01背包在代码上十分相似,思路也很类似 只是这里是有无限个物品 状态转移方程就很容易得出 dp[i][j]=max(dp[i-1][j],dp[i-1] 阅读全文
摘要:
01背包 有n种物品,背包重量为V,接下来有每个背包的重量w[i],价值v[i],求最大的总价值。 这是01背包的基本样式, 首先分析问题,有两种状态,放还是不放,显然得出了我们第一个dp方程 dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]) 表示前i个已经 阅读全文