一般dp
sillyf
这个作者很懒,什么都没留下…
展开
-
BZOJ 4720: [Noip2016]换教室
网上题解大致都有我只是贴上来标记一下而已总的来说测试时没有去考虑这一题是比较可惜的,因为没有看过太多关于期望的题就直接放弃了只能说细节比较多,推方程什么的中规中矩不算难吧只是还是参考了一下别人的罢了#include#include#define RG register#define INF 2e8using namespace std;inline int原创 2017-05-17 21:33:09 · 208 阅读 · 0 评论 -
51nod 1406 与查询 [dp]
题面传送门题解一个数&x==x的条件可以理解为转换为二进制后,x为1的位要对应为1设f[x]f[x]为范围内与&x==x的数的个数若yy转换为二进制后的所有1位x都有(yy为xx的子集),则对f[x]f[x]有贡献的数一定对f[y]f[y]有贡献所以可以枚举子集转移,但是这样算会有重复,于是从高位向低位转移,想象一下把xx拆几个1掉就可以变成yy了记得加输入输出优化原创 2018-01-09 18:56:19 · 285 阅读 · 0 评论 -
51nod 1486 大大走格子[容斥原理]
题面传送门题解好早以前就考过,当时根本不会O(nm)O(nm)的dp很简单,但是不够用啊。考虑通过障碍物转移原创 2018-01-09 18:54:53 · 295 阅读 · 0 评论 -
cf582B&&51nod 1566 重复的最长不下子序列
题意给出一个长度为n的循环节,问有t个这样循环节的数列的最长不下降子序列题解若要让一个循环节的所有元素都出现则最多要n个循环节,若有相同的应该更少,因为n不大,直接构造长度为n×nn \times n的数列做最长不下降子序列.若剩下还有没用上的,一定是选择出现次数最多的元素插在n×nn \times n的数列中,不到n节的话直接做肯定是不会错的…貌似还有矩阵加速的方法,不太会原创 2018-01-08 20:39:58 · 302 阅读 · 0 评论 -
BZOJ 3072: [Pa2012]Two Cakes [dp][记忆化搜索]
题意:原题很清楚了.考虑暴力dp dp[p][q]dp[p][q]表示第一只手在p另一只手在q的最短时间 1.若a[p]==b[q] 则dp[p][q]=min(dp[p−1][q],dp[p][q−1])+1dp[p][q]=min(dp[p-1][q],dp[p][q-1])+1 2.若a[p]!=b[q] 则dp[p][q]=min(dp[p−t][q−t])+t−1dp[p][q原创 2017-12-20 19:38:13 · 247 阅读 · 0 评论 -
洛谷 P1439 【模板】最长公共子序列
题意: 给出两个1~n的排列 求最长公共子序列原创 2017-12-20 20:22:43 · 398 阅读 · 0 评论 -
51nod 1274 最长递增路径[dp]
题面 题意:给定一张有重边有自环的无向图,求一条最长的路径使路径的权值严格单调递增把边从小到大排序后直接推 注意一下边权相同的就好了#include<cstdio>#include<algorithm>#define N 50000using namespace std;struct edge{ int x,y,z; bool operator < (const edge原创 2017-10-23 13:56:49 · 246 阅读 · 0 评论 -
51nod 1218 最长递增子序列 V2 [dp]
一个数如果在lis中出现,位置是一定的(吧,反正这样过了…)。 正着搞一遍lis,反着搞一遍(最长递减子序列),数在lis里的位置就确定了 如果它在这两个序列中的位置加起来为(lis长度+1)就说明这个数在lis中出现 记录lis每一个位置可以放的数的个数,为1则一定有,大于1则可能有#include<cstdio>#include<algorithm>#define N 50000us原创 2017-10-12 21:41:38 · 350 阅读 · 0 评论 -
bzoj 1009&&1875[矩阵优化dp]
贴代码…题解有空来打//bzoj 1875#include<cstdio>#include<cstring>#define P 45989using namespace std;struct edge{int from,to,next;}e[130];int n,m,t,A,B,cnt,ans,head[25];struct Matrix{ int v[125][125];原创 2017-10-12 21:28:11 · 200 阅读 · 0 评论 -
51nod 1597 有限背包计数问题[dp][阈值]
居然是读阈(yu第四声)值… 对于大小≤n√\leq \sqrt n的物品做多重背包(前缀和优化O(n)O(n)) 对于大小≥n√\geq \sqrt n的物品完全背包魔改一下:g[i][j]表示用i个物品体积为j的方案数g[i][j]g[i][j]表示用i个物品体积为j的方案数g[i][j] g[i][j]=g[i][j−i]+g[i−1][j−n√−1](前i个物品体积都加1,加入一个体积原创 2017-10-20 21:06:59 · 334 阅读 · 0 评论 -
51nod 1779 逆序对统计 [状压dp]
n范围小,可以状压 0/1表示是否已经给这道题选择了分数 按分数的顺序枚举 在某一个状态中,若给第i道题选择这个分数那么产生的贡献就是状态中第i位后的1的个数 如:状态为 10101,已经选好了1,3,5的分数,此时选择规定第2题的分数,贡献就是第2位之后1的个数为2 则会产生2对逆序数 一开始感觉会被卡预处理了一下#include<cstdio>#include<algorithm>原创 2017-10-11 21:41:58 · 319 阅读 · 0 评论 -
HDU 4507 吉哥系列故事——恨7不成妻[数位dp]
首先计算和7有关的数的个数很简单 然后是算这些数的平方和struct P{LL cnt,sum,tot;}dp[20][10][10];/*dp[pos][sum][mod]表示枚举到第pos位时,(pos之前的数位和%7)=sum,(pos之前的数%7)=mod如pos=4时,已经枚举了前3位:345sum=(3+4+5)%7=5,mod=(345)%7=2然后可以满足当前这个状态的个数原创 2017-09-28 07:51:22 · 156 阅读 · 0 评论 -
HDU 2089 不要62[数位dp]
数位dp简单题 dp[pos][state]表示pos位为6(state=1)或不为6(state=0)#include<cstdio>#include<cstring>using namespace std;inline int read(){ int a=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;原创 2017-09-28 07:20:21 · 180 阅读 · 0 评论 -
BZOJ 1003: [ZJOI2006]物流运输
刷题#include#includeusing namespace std; int n,m,k,e,v[21],f[101],cost[101][101],dis[21][21];bool flag[21],time[21][101]; void work(){ memset(v,0,sizeof(v)); flag[1]=1; v[1]=0;原创 2017-07-04 17:15:08 · 241 阅读 · 0 评论 -
BZOJ 2386: [Ceoi2011]Team
手撸了几波小数据容易发现最优解之一是所有人都按a[i]排序后再一段一段分开如果不是这样的话,总会可以通过一些交换使之变成有序的考虑dp,排序后f[i]=max{f[i-k]+1},k#include#include#define N 1000005using namespace std; int read(){ int a=0,f=1;char c=ge原创 2017-07-02 22:34:25 · 408 阅读 · 0 评论 -
BZOJ 1296: [SCOI2009]粉刷匠
对于每一行f[i][j]表示前i列刷j次最多刷对的格子数易得f[i][j]=max(f[i][j], max{f[k][j-1]+max(cnt[i]-cnt[k],i-k-(cnt[i]-cnt[k]))} )cnt[i]表示前i个中的1的数量(或0的数量)然后对每一行是一个分组,对总体做一次分组背包就好了#include#includeusing names原创 2017-06-30 09:11:25 · 225 阅读 · 0 评论 -
BZOJ 1002: [FJOI2007]轮状病毒
无形划水,最为致命#includeusing namespace std;int n;struct P{int num[51],len;}f[101];P cheng(P x){ int c=0; for(int i=1;i<=x.len;++i) { x.num[i]=x.num[i]*3+c; c=x.num[i]/10; x.num[i]%=10; }原创 2017-03-23 20:45:06 · 489 阅读 · 0 评论 -
codeforces449D&&51nod 1407 与与与与 [dp][容斥原理]
中文题面题解设f[x]f[x]为&x==x的数的个数,g[x]g[x]为x转化为二进制以后1的个数转化一下,求等于0的组数即 所有组合情况-含有位为1的组合数容斥求一下含有位为1的组合数∑x=1220=(−1)g[x]−1∗(2f[x]−1)\sum^{2^{20}}_{x=1}=(-1)^{g[x]-1}*(2^{f[x]}-1)2的幂减一是因为不能一个都不选,原创 2018-01-09 18:58:07 · 353 阅读 · 0 评论