[文文殿下]基本的DP技巧】的更多相关文章

. 二进制状态压缩动态规划 对于某些情况,如果题目中所给的限制数目比较小,我们可以尝试状态压缩动态规划.例如,题目中给出数据范围\(n<=20\),这个一般情况下是一个状压DP的提示. 状态压缩,顾名思义,要把每种状态压缩起来.一个经典的问题是洛谷P1171,也就是著名的货郎担问题,它是一个NPC难题,目前不存在多项式算法.当题目中\(n\)的范围比较小时,我们可以考虑使用状态压缩动态规划(状压DP)来解决.(注:本文出现的"状压DP"若无特殊说明,均指状态压缩动态规划) 我们用…
今天复习树形dp时发现一道比较古老的题,叫选课,是树形dp的一道基础题,也是多叉树转二叉树应用的模版题 多叉树转二叉树的应用非常广泛,因为如果一个节点的儿子太多,一个一个存下来不方便去查询,并且会增加复杂度,但是这里我们就有一个O(n)的复杂度的方法把多叉树转换为二叉树,转换成二叉树后就更方便查询,因为每个节点最多就两个儿子节点,减少了复杂度并且让代码实现起来更容易 多叉树转二叉树图示: 在这张图中,右边那棵二叉树由左边的多叉树转换而来,并且这棵二叉树是竖着相连的是父子关系,横着相连的是兄弟关系…
题目链接:900 E. Maximum Questions 题意: 给出一个长度为n只含有a和b还有'?'的串s,且'?'可以被任意替换为a或b.再给出一个字符串t (奇数位上为a,偶数位上为b,所以在题目中只给出了t的长度m),现在要求保证t在s中出现的次数最多的情况下面,使用'?'最小的情况使用了几个问号. 题解: 拿到这个题目可以看出是DP,但是比较难以解决的就是如何确定在第i个位置时前面m个字符能够满足t,这里我看了别人的题解 -.-哇,震惊!首先的话先对'?'做前缀和,然后设置两个数组…
https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #include <iostream>#include <cstdio> #define REP(i,a,n) for(int i=a;i<=n;++i) using namespace std; , M = 1e7+; int n; int a[N], dp[N][N], x[M],…
Day0 今天早上三点半才睡着,五点起床,前往省城郑州.与省实验常老师汇合,坐上高铁,下午三点半多才到广州二中. 下午随便找了一个教室进去敲一敲代码,发现自己越来越菜了. 和一大堆网上的dalao面基了呢!开心! 晚上开幕式,节目很好看,讲话很 $\color {red} {风趣} $. Day1 早上的饭好评!可以说是非常好吃了d(`・∀・)b 有面包鸡蛋和牛奶喔 _(:3 」∠ )_ 上午选择了第二教室这个地方QAQ,没能去参加松松松的小黄鸭宣传仪式 Σ( ° △ °).讲了生成函数和他那一…
Day-1 本段更新于 2018年11月8日23:26:44 今天还在机房里面,无所事事吧.上午睡了一上午,出去理了一下发,花了20块钱 QAQ. 下午来到机房,复习了一下exgcd的东西. 发现自己网络流好久没写了,洛谷群里又在讨论网络流,稍微有点慌QAQ 以为自己什么都准备好了,临近NOIp才发现自己什么都没准备好.KMP也好久没摸了,惨惨啊. 爆零预定 然后晚上和大家交流了一下注意事项(其实没有注意事项)以及把模拟赛的坑填了一下. Day 0 本段更新于 2018年11月9日17:27:1…
题解 我们枚举建厂的位置,发现有个\(n^2\)的DP.随手搞个斜率优化到\(O(n)\). #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 21000 ; const ll inf = 100000000000000LL; int n; ll f[maxn]; ll w[maxn],s[maxn],m[maxn],h[maxn],cnt[maxn]; ll d[maxn],…
题解 我们考虑将棋盘扩大一倍,这样相当于取膜.然后,我们只要对x,y,的位置分类讨论,做四次crt就行.具体细节看文文代码. #include<cstdio> #include<algorithm> typedef long long ll; const ll inf = 1000000000000LL; int a[10],m[10]; inline ll exgcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1;y=0; ret…
题解 这是一个经典的概率DP模型 设\(f_{i,j}\)表示考虑到前\(i\)张牌,有\(j\)轮没打出牌的可能性,那么显然\(f_{0,r} = 1\). 考虑第\(i+1\)张牌,他可能在剩下的\(J\)轮里打出,也可能都打不出.那么显然有两种转移. \(f[i+1][j]+=f[i][j]*(1-p[i+1])^j\) 和 \(f[i+1][j-1]+=f[i][j]*(1-(1-p[i+1])^j)\) 在进行第二种转移的时候,我们把添加的值乘上他的伤害累加进答案 #include<c…
题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 数据规模 di,s<=100000 tot<=1000 题解: 首先,我们不考虑硬币的限制,用动态规划求解背包方案数.然后考虑容斥原理,进行解题.编程上有技巧:使用dfs来减少代码量. #include<cstdio> typedef long long ll; const int maxn = 1e5+10; i…