
DP
Sirius_Ren
▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇自己刮~~~
展开
-
POJ 3661 DP
题意: 思路: i表示到了i,j表示疲劳度为j f[i][j]表示能跑的最大距离 f[i][j]=f[i-1][j-1]+a[i] if(i-j>=0)f[i][0]=max(f[i][0],f[i-j][j]); f[i][0]=max(f[i][0],f[i-1][0]);//By SiriusRen#include <cstdio>#include <cstring>#i原创 2016-09-25 14:26:47 · 394 阅读 · 0 评论 -
POJ 3671 DP or 乱搞
思路: 1.DP f[i][j]:前i个数 最后一个数是j的最小花费 f[i][j]=min(f[i][j],f[i-1][k]+(a[i]!=j));1<=k<=j 这种做法比较有普遍性… 2. 直接枚举断点乱搞不就行了嘛… 枚举在哪儿转折成的2 (注意全是1或者全是2的情况就OK了)//By SiriusRen#include <cstdio>#include <cstring原创 2016-09-28 13:38:32 · 613 阅读 · 0 评论 -
POJ 3265 DP
思路: f[i][j]表示前i天能做j道题 (是做 不是做完) if(f[i-1][k]) if(suma[j]-suma[k]+g[i-1][k]<=n) f[i][j]=1,g[i][j]=min(g[i][j],sumb[j]-sumb[k]); g[i][j原创 2016-10-14 00:24:32 · 239 阅读 · 0 评论 -
BZOJ 2748 DP
思路: DP啊 f[i][j]表示第i场能否到达j音量 if(j>=xx)f[i][j]=max(f[i-1][j-xx],f[i][j]); if(j+xx<=ml)f[i][j]=max(f[i-1][j+xx],f[i][j]);搞定//By SiriusRen#include <cstdio>#include <algorithm>using namespace std;原创 2016-10-14 00:27:37 · 301 阅读 · 0 评论 -
POJ 2151 概率DP
思路: f[i][j][k]表示i所学校 前j题 解出了k道 初始化f[i][0][0]和f[i][1][0] f[i][j][k]=f[i][j-1][k-1]a[i][j]+f[i][j-1][k](1-a[i][j]);这个时候f[i][n][k]表示第i所学校做出k道题的概率我们可以维护一个 sum[i]表示第i所学校做出1<=x<=n道题的概率 kth[i]表示第i所学校做出1原创 2016-09-29 10:19:47 · 366 阅读 · 0 评论 -
POJ 3280 DP
题意: 思路: DP f[i][j]表示把i到j变成回文串的最少代价f[start][end]=f[start+1][end]+min(node[a[start]].del,node[a[start]].add);f[start][end]=min(f[start][end],f[start][end-1]+min(node[a[end]].add,node[a[end]].del)原创 2016-09-29 11:39:47 · 1081 阅读 · 0 评论 -
POJ 3257 DP
题意: 思路: 用vector存上本出发点能到的地方&成本&有趣指数(用结构体保存) 然后DP就好了 f[i][j]表示到了i 成本为j的有趣指数最大是多少 f[vec[i][k].end][j+vec[i][k].c]=max(f[vec[i][k].end][j+vec[i][k].c],f[i][j]+vec[i][k].f);//By SiriusRen#include原创 2016-10-26 13:04:54 · 270 阅读 · 0 评论 -
POJ 2430 状压DP
题意: 思路: 先预处理出所有格子的statement statement=1–>只有上边的格子被覆盖 statement=2–>只有下边的格子被覆盖 statement=3–>上下都被覆盖f[i][j][k]表示状态为i时,前j个地方的奶牛,盖k座房子 最少盖住的格子i有四种情况i=1代表只有上边的格子被覆盖i=2代表只有下边的格子被覆盖i=3代表上下被同一个房子覆原创 2016-10-27 08:24:19 · 373 阅读 · 0 评论 -
BZOJ 1231 状压DP
思路: f[i][j]i表示集合的组成 j表示选最后一个数 f[i][j]表示能选的方案数 f[i|(1<< k)][k]+=f[i][j]; k不属于i j属于i且符合题意最后Σf[(1<< n)-1][i]就是答案了 注意用long long//By SiriusRen#include <cmath>#include <cstdio>using namespace std原创 2016-10-27 15:43:12 · 374 阅读 · 0 评论 -
POJ 3184 DP+剪枝
思路: 先找到每i头奶牛能在的位置 (一段区间) 记为L[i]和R[i]f[j]表示在位置j取到的最小值 每回在范围内更新一哈 //By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n,d,L,a[100500],f[100500],l[1005原创 2016-10-23 20:49:14 · 275 阅读 · 0 评论 -
POJ 1985 求树的直径 两边搜OR DP
Cow Marathon DescriptionAfter hearing about the epidemic of obesity in the USA, Farmer John wants his cows to get more exercise, so he has committed to create a bovine marathon for his cows to run. Th原创 2016-04-10 12:22:54 · 699 阅读 · 0 评论 -
POJ 3181完全背包(+高精)
思路: f[i]表示还剩i空间的方案数套个高精 (网上有人把它拆成了两个long long) 其实这道题的高精并不难写…..//By SiriusRen#include <cstdio>using namespace std;int n,k,f[1111][53],flag;int main(){ scanf("%d%d",&n,&k); f[n][0]=1;原创 2016-10-23 17:40:04 · 211 阅读 · 0 评论 -
POJ 1631 nlogn求LIS
方法一: 二分我们可以知道 最长上升子序列的 最后一个数的值是随序列的长度而递增的 (呃呃呃 意会意会)当我们枚举到i的时候 就从已知的最长上升子序列中找到第一个比它大的值,并取个min//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n,cas原创 2016-09-25 14:34:07 · 615 阅读 · 0 评论 -
POJ 1141 括号匹配 DP
黑书原题 区间DP,递归输出 不看Discuss毁一生 (woc还真有空串的情况啊)//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n,f[111][111];char s[111];void print(int l,int r){原创 2016-09-25 15:43:54 · 362 阅读 · 0 评论 -
POJ 3670 DP LIS?
权值为1~3 好了 此题是水题…… i表示到了第i个数,j表示结尾的数是j f[i][j]=min(f[i][j],f[i-1][k]+(a[i]!=j)) 1<=k<=j 最长上升的.同理我们可以再写一个g[i][j]表示最长下降的//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using原创 2016-09-26 16:27:52 · 525 阅读 · 0 评论 -
BZOJ 1296 DP
思路: f[i][j][k] 表示 第i行第j列 用了k中颜色的最多涂块数量 f[i][j][k]=max(f[i][j][k],f[i][l][k-1]+sum1[i][j]-sum1[i][l]); g[i][j]表示前i列 用了k中颜色的最多涂块数量 g[i][k]=max(g[i][k],g[i-1][k-j]+f[i][M][j]);输出答案就好了//By SiriusRen#原创 2016-10-12 08:07:11 · 207 阅读 · 0 评论 -
POJ 1636 DFS+DP
思路: 先搜索出来如果选这个点 其它哪些点必须选 跑个背包就好了//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 66666int xx,yy,v[N],next[N],first[1004],tot,top,vis[1004],cas原创 2016-11-03 08:47:07 · 320 阅读 · 0 评论 -
BZOJ 1592 DP
思路:f[i][j]表示前i个数 最后一个数是原数列的第j个的 最小值//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n,a[2222],cpy[2222],minn[2222],f[2222][2222],temp[2222],ans=0x7fffff原创 2016-11-03 09:24:30 · 360 阅读 · 0 评论 -
BZOJ 1055 DP
思路: f[i][j][k]表示i到j匹配了字母k if(m,n能匹配上k) f[i][j][k]|=f[i][l][m]&f[l+1][j][n] 一个大枚举 就OK了~//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int W,I,N,G;boo原创 2016-10-12 16:49:24 · 252 阅读 · 0 评论 -
POJ 1682 DP
原创: http://www.cnblogs.com/proverbs/archive/2012/10/03/2711151.html 超高仿: http://blog.youkuaiyun.com/mars_ch/article/details/53020127高仿://By SiriusRen#include <cstdio>#include <cstring>#include <algorit原创 2016-11-03 15:12:27 · 421 阅读 · 0 评论 -
BZOJ 1571 DP
思路: 预处理出在能力值为i的时候 滑雪一次的最小时间f[i][j]表示i时间 j的能力值 最多的滑雪次数我先用vector 把课程按起点push进去1.for(int k=0;k<vec[i].size();k++){ f[i+vec[i][k].l][vec[i][k].a]=max(f[i+vec[i][k].l][vec[i][k].a],f[i][j]);原创 2016-10-27 19:48:16 · 304 阅读 · 0 评论 -
POJ 3042 区间DP(费用提前计算相关的DP)
题意: 思路: f[i][j][1]表示从i到j的区间全都吃完了 现在在j点 变质期最小是多少 f[i][j][0]表示从i到j的区间全都吃完了 现在在i点 变质期最小是多少 f[i][j][0]=min(f[i+1][j][0]+(s[i+1]-s[i])(n-j+i),f[i+1][j][1]+(s[j]-s[i])(n-j+i)); f[i][j][1]=min(f原创 2016-10-28 11:46:57 · 1012 阅读 · 1 评论 -
BZOJ 4710 容斥原理+dp
http://www.cnblogs.com/CXCXCXC/p/5093584.html//By SiriusRen#include <cstdio>using namespace std;int n,m,K,mod=1000000007,f[33][33][666][9];int main(){ scanf("%d%d%d",&n,&m,&K); f[1][0][0][0原创 2017-02-27 23:03:18 · 685 阅读 · 0 评论 -
BZOJ 1989 概率相关
思路: 一条边免费的概率为 (经过它的路/总路径条数)^2 DFS即可有个地方没有用 long long炸了好久…//By SiriusRen#include <cstdio>using namespace std;const int N=20050;int n,m,xx,yy,first[N],next[N],v[N],tot,size[N];typedef long long ll原创 2017-01-29 22:07:24 · 493 阅读 · 0 评论 -
BZOJ 1369 树形DP
思路: f[i][j] 表示节点i 染成j时 子树的最小权值 (我会猜这个j很小 你打我吖~) 随便DP一发就好了 (证明我也不会)//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=20050,inf=0x3f3f3f3f;int原创 2017-02-15 00:13:17 · 458 阅读 · 0 评论 -
BZOJ 1786 DP
思路: 肯定从小往大填合适了 f[i][j]表示第i个数是j的最少逆序对数 f[i][j]=min(f[i-1][k]+cost,f[i][j]) 优化一下成O(nk)就好啦~ (不优化也可以过的…)//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;co原创 2017-02-15 00:16:59 · 689 阅读 · 0 评论 -
BZOJ 4321 DP
思路: 这个DP太神了… 完全没想到 http://blog.youkuaiyun.com/geotcbrl/article/details/49663401//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n;long long f[1005][1005][2原创 2017-02-15 00:17:56 · 610 阅读 · 0 评论 -
BZOJ 1806 DP
思路: f[i][a][b][c][d] 表示在第i天 昨天1矿吃的是a 前天1矿吃的是b 昨天2矿吃的是c 前天2矿吃的是d 的最优解暴力转移 哦 需要优化一下空间… 变成i%2 就好了//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const原创 2017-02-01 15:25:53 · 425 阅读 · 0 评论 -
BZOJ 3522 DFS+DP
思路: f[]表示选1个点的 g[]表示选2个点的 dp一下 ans+=(ll)g[k]*deep[k]; g[k]+=(ll)f[k]*deep[k]; f[k]+=deep[k];//By SiriusRen#include <cstdio>#include <cstring>using namespace st原创 2017-03-04 21:04:47 · 392 阅读 · 0 评论 -
BZOJ 4033 树形DP
http://blog.youkuaiyun.com/mirrorgray/article/details/51123741 安利队长blog… 树形dp吧,状态挺显然的,dp[x][j]表示以x为根的子树中,选择了j个黑点的答案,但注意这个答案是整棵树的答案。 我们只需要对于每个儿子背包一遍,在最后更新一下dp[x][j]即可,具体可以看一眼程序。 非常重要的是,这个复杂度是n^2的,需原创 2017-03-08 21:16:26 · 557 阅读 · 0 评论 -
BZOJ 3195 DP
http://www.cnblogs.com/CXCXCXC/p/5093584.html//By SiriusRen#include <cstdio>using namespace std;int n,m,K,mod=1000000007,f[33][33][666][9];int main(){ scanf("%d%d%d",&n,&m,&K); f[1][0][0][0原创 2017-02-27 23:02:51 · 509 阅读 · 0 评论 -
BZOJ 2287 DP+容斥
思路: 先处理出来f[j]表示这i个物品都可用 填满容量j的方案数容斥一发处理出来g[j]=g[j-w[i]] 表示i不能用的时候 填满容量j的方案数//By SiriusRen#include <cstdio>using namespace std;int n,m,w[2005],f[2005],g[2005];int main(){ scanf("%d%d",&n,&m),f原创 2017-02-17 19:46:14 · 720 阅读 · 0 评论 -
BZOJ 3209 数位DP
思路: 先预处理出来组合数 按位做 枚举sum[x]是多少注意Mod不是一个质数//By SiriusRen#include <cstdio>using namespace std;#define int long longint n,top,w[66],C[66][66],ans=1,cnt,Mod=10000007;int pow(int x,int y){ int r原创 2017-01-01 15:42:31 · 411 阅读 · 0 评论 -
POJ 3046 DP
题意: 思路:先说O(A^2T)的做法 f[i][j]表示前i个家族选j个蚂蚁的方案数 f[i][j]+=f[i-1][k] j-vis[i]<=k<=j然后前缀和优化一哈 就成O(AT)的了我们发现空间还是会炸 这样子就压掉一维好了 空间是O(A)的嗯就酱//By SiriusRen#include <cstdio>#include <cstring>#inclu原创 2016-10-28 12:54:29 · 215 阅读 · 0 评论 -
BZOJ 2037 区间DP
跟POJ 3042是一个类型的http://blog.youkuaiyun.com/qq_31785871/article/details/52954924 思路: 先排个序 (把初始位置也插进去) f[i][j]表示从第i个到第j个之间的蛋都被收完了 f[i][j][0]表示在地点i f[i][j][1]表示在地点j 维护一个sumv数组 是v的前缀和 f[i][j][原创 2016-10-30 00:01:42 · 576 阅读 · 0 评论 -
POJ 3170 线段树优化DP
题意: 思路: 先搞一个vector 存以T2结尾的结构体 (结构体里面有开始工作的时间和花费) f[i]表示取区间[M,i)的代价 易得f[i]=min(f[k]+w,f[i]);T1<=k//By SiriusRen#include <vector>#include <cstdio>#include <cstring>#include <algorithm>u原创 2016-10-30 01:10:02 · 674 阅读 · 1 评论 -
POJ 1991 DP
题意: 思路:考虑DP 先把事件按照地点顺序排个序 f[i][j][0]表示从i到j还没有去过 现在在i f[i][j][1]表示从i到j还没有去过 现在在j 那么方程就呼之欲出了 f[i][j][0]=max(min(f[i-1][j][0]+node[i].pos-node[i-1].pos,f[i][j+1][1]+node[j+1].po原创 2016-10-30 19:27:38 · 436 阅读 · 0 评论 -
POJ 2111 DP+记录路径
题意: 思路: 类似滑雪 //By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 444int n,ans=-1,s[N*N],map[N][N],cnt,f[N][N],xx[]={2,2,1,1,-1,-1,-2,-2},yy[]={原创 2016-10-31 10:35:28 · 695 阅读 · 0 评论 -
POJ 2378 树形DP??
思路: 找到每个节点的儿子size的最大值 和n-当前节点size 取个Max//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 22222int n,first[N],next[N],v[N],tot,size[N],minn[N],x原创 2016-11-01 09:33:33 · 680 阅读 · 0 评论 -
BZOJ 1578 DP
思路:裸的完全背包//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int s,d,m,a[66][66],ans[55],f[555555];#define N 505000int main(){ scanf("%d%d%d",&s,&d,&m);原创 2016-11-02 14:39:16 · 362 阅读 · 0 评论