
DP
文章平均质量分 66
leolin_
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【dp求期望值】POJ 3756
dp求期望double dp[1024][111];//dp[i][j]第i round到j格的概率bool stop[111];int go[111];int n;int main(){ while(scanf("%d",&n) !=-1){ int i,j; int m; memset(go,0,sizeof(go));原创 2012-03-30 20:31:05 · 886 阅读 · 0 评论 -
【背包】
首先说下动态规划,动态规划这东西就和递归一样,只能找局部关系,若想全部列出来,是很难的,比如汉诺塔。你可以说先把除最后一层的其他所有层都移动到2,再把最后一层移动到3,最后再把其余的从2移动到3,这是一个直观的关系,但是想列举出来是很难的,也许当层数n=3时还可以模拟下,再大一些就不可能了,所以,诸如递归,动态规划之类的,不能细想,只能找局部关系。1.汉诺塔图片(引至杭转载 2011-08-23 21:36:30 · 602 阅读 · 0 评论 -
【二维费用背包】HDU 2159
#define N 101int dp[101][101];//杀i只怪忍耐度为j的最大经验int a[101],b[101];int main(){ int n,m,k,s; while(scanf("%d%d%d%d",&n,&m,&k,&s) != -1){//还需的经验值,保留的忍耐度,怪的种数,最多的杀怪数 int i,j; for(原创 2012-02-06 03:34:22 · 476 阅读 · 0 评论 -
【多重背包】HDU 1059
#define N 10int num[N];int dp[120010];int V;//容量void zeroone(int cost,int val){//费用,价值 int i; for(i=V;i>=cost;i--){ if(dp[i]<dp[i-cost]+val){ dp[i] = dp[i-cost]+val;原创 2012-02-05 18:24:11 · 558 阅读 · 0 评论 -
【分组背包每组至少一个】HDU 3033
int dp[11][10010];struct node{ int w[101],val[101]; int cnt;}p[11];int main(){ int n,m,k; while(scanf("%d%d%d",&n,&m,&k) != -1){//总共数量,手上金钱,鞋子种类 int i,j; for(i=1;i<=原创 2012-02-06 02:14:10 · 1006 阅读 · 0 评论 -
【分组背包】HDU 1712
#define N 101int a[N][N];int dp[N];//费用:天数//价值:a[i][j]//每个课程为一组//组内的天数为一个物品int main(){ int n,m; while(scanf("%d%d",&n,&m) && (n+m)){ int i,j; memset(dp,0,sizeof(dp));原创 2012-02-05 23:59:28 · 505 阅读 · 0 评论 -
【多重背包】POJ 1014
0ms秒杀。。。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace st原创 2011-08-23 22:53:02 · 474 阅读 · 0 评论 -
hdu 1284 钱币兑换问题 完全背包
http://acm.hdu.edu.cn/showproblem.php?pid=1284#include//完全背包———0msusing namespace std;#define N 32768__int64 a[3]={1,2,3},dp[N+10];int main(){ //freopen("a.txt","r",stdin); int n; memse原创 2011-04-30 17:13:00 · 695 阅读 · 0 评论 -
【概率dp】POJ 3071
http://poj.org/problem?id=3071题意是又2^n支球队,球队两两之间进行比赛,例如开始时0-1, 2-3, 4-5, 6-7...............然后晋级后又是相邻两两之间比赛,问最大可能的胜者编号。方法:概率dp。设dp[i][j]表示第i轮j队胜的概率, 其中dp[i][j] += ∑dp[i-1][k]*p[j][k],下面的hint已经给出了提原创 2012-02-04 02:10:15 · 707 阅读 · 0 评论 -
【背包模板】
int V;//容量 //01void zeroone(int cost,int val){//费用,价值 int i; for(i=V;i>=cost;i--){ if(dp[i]<dp[i-cost]+val){ dp[i] = dp[i-cost]+val; } } } //原创 2012-02-05 20:21:34 · 688 阅读 · 0 评论 -
hdu 2069--类完全背包
http://acm.hdu.edu.cn/showproblem.php?pid=2069#includeusing namespace std;int a[5]={1,5,10,25,50},dp[1001][2600];int main(){ //freopen("a.txt","r",stdin); int n; memset(dp,0,size原创 2011-04-30 16:51:00 · 701 阅读 · 0 评论 -
【dp】POJ 1141
http://poj.org/problem?id=1141dp求最优解。#define N 110char str[N];int dp[N][N];//i到j之间插入的最小字符数int tag[N][N];//记录需要插入字符的位置void gao(int n){ int i,j,k; for(i=0;i<=n;i++){ for(j=0;j<=n原创 2012-02-04 13:07:09 · 506 阅读 · 0 评论 -
【分组背包】HDU 3535
int max(int a,int b){return a>b?a:b;}int dp[110][110];int main(){ int n,t; while(scanf("%d%d",&n,&t) != -1){ int i,j,k; memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++){原创 2012-02-05 20:13:51 · 506 阅读 · 0 评论 -
【多重背包】HDU 1171
题意:分物品,使得两份的价值差最小。方法:相当于求容量为sum/2的最大价值,所以,所需费用=当前物品价值#define N 55int v[N],m[N];int dp[50*50*100+100];int V;//容量void zeroone(int cost,int val){//费用,价值 int i; for(i=V;i>=cost;i--){原创 2012-02-05 16:53:45 · 697 阅读 · 0 评论 -
【LCA模板题】POJ 1330
RMQ版#define N 10010struct edge{ int v; int next;}e[2*N];int ecnt;int head[N];bool vis[N];int n;//点数int R[N];//第一次出现i点下标int p[N*2];//记录路径点编号//int dis[N];//与根的距离int dep[2*N];//深度int原创 2012-02-08 04:31:03 · 1037 阅读 · 1 评论 -
【背包】POJ 1882
题目有点啰嗦,说白了给出一个上限s,n套邮票,每套有m张面值为ai的邮票,问不超过上限的前提下能组成最大的连续面值和(从1开始)。dp[N]:组成面值为i的最小邮票数量+完全背包,更新几个记录值#define N 1100int dp[N];//组成面值为i的最小数量int a[12][12];int main(){ int s; while(scanf("%d"原创 2012-02-06 21:32:55 · 620 阅读 · 0 评论 -
【鸽笼原理】ZOJ 2955
用到了鸽笼原理的结论:设可选的 N 个数从小到大依次为 a(1)、 a(2) … a(N),则在最优的取法中,小于 a(N) 的数不会多于 a(N) 个。#define N 10005int dp[N];int w[111];int main(){ int t; scanf("%d",&t); while(t--){ int n,c;原创 2012-03-30 13:09:18 · 921 阅读 · 0 评论 -
【树形dp统计距离为k的点对】VK Cup 2012 Round 1 D. Distance in Tree
http://codeforces.com/contest/161/problem/D树形dp,很优美,利用了树的性质和dfs回溯...注意以防重复,所以要把计数提前到更新操作前#define N 50005LL dp[N][505];vector v[N];LL ans = 0;int n,k;void dfs(int u,int fa){ int i; d原创 2012-03-12 17:53:14 · 1136 阅读 · 1 评论 -
【斜率优化dp】HDU 2993
第一道斜率优化dp,看着别人的报告做的,做之前建议看一下04年周源的《浅谈数形结合思想在信息学竞赛中的应用》论文 http://wenku.baidu.com/view/f6421ce8b8f67c1cfad6b8ac.html斜率优化其实就是把每个状态看作直角坐标系上离散的点抽象出x,y 表示斜率 (y2 - y1) / (x2 - x1) 于一个关系状态i个函数的关系,然后原创 2012-03-09 00:51:20 · 957 阅读 · 0 评论 -
【bfs优先队列】POJ 3635
http://poj.org/problem?id=3635#define N 1005struct node{ int u; int len;};vector v[N];int n,m;int price[N];void add(int a,int b,int w){ node tmp; tmp.u = b; tmp.len = w;原创 2012-03-06 12:15:41 · 565 阅读 · 0 评论 -
【dp】Codeforces Beta Round #2 B
http://codeforces.com/problemset/problem/2/B分别对2和5dp,取最小的,注意有0的情况,如果最后2和5最小值ans>=1时就走0,否则走2、5,至于路径我就用比较方便的方法:对每一点记录前一点的坐标写得有点搓.......#define N 1005int dp[N][N][2];int n;bool zero;struct no原创 2012-03-06 01:07:34 · 500 阅读 · 0 评论 -
【dp】VK Cup 2012 Qualification Round 1 ——E
E dp类似01背包,只是这里不一定取完k个,而01背包则一定取完k个int dp[4444];int ans;int main(){ int n,m; cin>>n>>m; int i,j; int s,d; ans = 0; while(n--){ cin>>s>>d; for(i=m;i>=0;i原创 2012-03-05 21:31:38 · 563 阅读 · 0 评论 -
【dp】Codeforces Round #110 (Div. 1) C
http://codeforces.com/contest/156/problem/C可以发现所有可以转化的串的字符总和都相同,所以可以先预处理求出长度为i总和为j的字符串有多少个,转移方程很容易写#define MOD 1000000007LL dp[110][26*110];char str[110];void init(){ int i,j,k; memset(原创 2012-03-01 22:17:28 · 758 阅读 · 0 评论 -
【状态压缩DP】HDU 2167
跟POJ 1185炮兵阵地差不多int g[16][16];int st[1001];char str[101];int dp[16][(1<<15)];int num[16][1001];int n;int tot;bool ok(int x){ if(x & (x<<1))return 0; if(x & (x>>1))return 0; return原创 2012-02-24 21:32:44 · 676 阅读 · 0 评论 -
【状态压缩DP】POJ 1185
稍后放出解释。。。int st[66];int cur[66];char str[110][15];int dp[110][66][66];//dp[i][j][k] 表示第i行状态为j,第i-1状态为k时的最大炮兵个数int num[66];int n,m;int tot;bool ok(int x){ if(x & (x<<1))return 0; if(x原创 2012-02-24 20:26:32 · 466 阅读 · 0 评论 -
【状态压缩DP】POJ 1170
题意:一个商店提供多种商品,当用户单独购买商品时有一个价格,当用户组合购买时可以获得优惠,现在提供多种优惠方案和需要购买的物品总数,问最大的优惠是多少。输入27 3 28 2 521 7 3 52 7 1 8 2 10表示有 2 种商品,编号分别是 7 和 8,分别要购买的数量是 3 和 2,2 和 5 是它们的单件购买价格。接下来是 2 种优惠。第 1 种优惠原创 2012-02-23 23:23:37 · 738 阅读 · 0 评论 -
Codeforces Round #105 (Div. 2)
AB水题。C贪心构造。分情况讨论:1、a == 0或b != 0 ,先处理b个的情况,可以利用2的幂次来构造,因为例如1,2,4,8,16......2的幂次序列满足后一个总大于前面所有值之和,可以化成二进制验证,在处理a2、a != 0&& b==0,如果a==n-1&&b==0很明显矛盾;否则就先处理a,再处理b,前面要有两个1保证a情况int main(){原创 2012-02-03 04:24:36 · 719 阅读 · 1 评论 -
【LCA+树形DP】POJ 3417
参考了该blog的思路http://www.cppblog.com/Yuan/archive/2010/07/11/120101.html,orz...........#define N 100010struct edge{ int v; int len; int next;}e[2*N];int ecnt;int head[N];bool vis[N];原创 2012-02-08 17:57:59 · 857 阅读 · 0 评论 -
【RMQ+LCA】ZOJ 3195
求三点的最短路径和,先求出两两之间的路径和,再除以2就是答案,可以把它看作数轴上的三点,另外,这还可以推广到一般情况由于zoj挂了,暂时放在这里,应该可以过的2月8日更新:wa了一次,原因是预处理dp数组的第二维开小一倍,本来是re才对,结果返回wa,最讨厌这样子...#define N 50010struct edge{ int v; int len;原创 2012-02-08 02:10:08 · 918 阅读 · 0 评论 -
【概率dp】POJ 2151
http://poj.org/problem?id=2151题意:有M道题,T支队,给出每支队ac每道题的概率,问每支队ac至少1道题并且冠军ac的题数>=N的概率。方法:先对每支队进行dp,设dp[i][j]表示前i题ac了j题的概率,转移方程:dp[i][j] = dp[i-1][j]*(1-p[i])+dp[i-1][j-1]*p[i];p[i]表示该队aci题的概率,至于要回答题目原创 2012-02-03 22:18:15 · 493 阅读 · 0 评论 -
【转】基于连通性状态压缩dp
http://blog.imnettle.net/index.php/archives/168转载 2012-02-01 09:06:12 · 742 阅读 · 0 评论 -
【树形dp】POJ 1463
dp[k][0]表示以k点为根的子树最小需要的结点数(k不取),同样,dp[k][1]表示以k点为根的子树最小需要的结点数(k取),其中,父结点不取,则儿子结点就必取有转移方程:dp[root][0] = dp[son][1],dp[root][0] = min( dp[son][1],dp[son][0] ) +1,利用dfs回溯进行dp#include #include #in原创 2012-01-14 17:02:31 · 492 阅读 · 0 评论 -
hdu 1559【最大子矩阵和DP】
这题比poj那道多了限制,就是规定了子矩阵大小,开始看到时间10s,果断暴力,接着又果断TLE,加一点点优化还是TLE,坑爹!接着就用DP,怎么DP?很简单,令a[i][j]为1#include #include #include #include #incl原创 2011-08-13 02:33:45 · 795 阅读 · 0 评论 -
poj 1050 【最大子矩阵和DP】
最大子矩阵问题:问题描述:(具体见http://acm.pku.edu.cn/JudgeOnline/showproblem?problem_id=1050) 给定一个n*n(0Example: 0 -2 -7 0 9 2 -6 2 -4 1原创 2011-08-12 21:51:56 · 649 阅读 · 0 评论 -
ural 1119【dp+精度】
本题明显是dp,用贪心的思想,肯定要走最多的捷径,所以dp[i]表示到达当前捷径之前最多的捷径数状态方程为dp[i]=max(dp[i],dp[j]+1),之前还要排序处理一下,接着就是蛋疼的精度,wa了几次,最后要记得用floor(ans+0.5)处理一下。上代码:#i原创 2011-08-06 00:25:17 · 533 阅读 · 0 评论 -
【树形DP---未解决】hdu 3660
题意:给出n个点,n-1条边,问从节点0到最远的子叶的距离满足L方法:树形DP,dis[u]数组表示0节点到当前节点u的距离,dp[u]数组表示最远的子叶节点到u节点的满足要求的距离,最后dp[0]就是答案。这dp妙就妙在利用了的dfs回溯,从最远子节点到0节点进行dp贴原创 2011-09-03 01:27:33 · 541 阅读 · 0 评论 -
poj 3160【tarjan缩点+拓扑排序+DP】
http://poj.org/problem?id=3160方法:tarjan缩点+topsort+dp,注意这句话. To save vigor, flymouse decided to choose only one of those rooms as the place原创 2011-08-01 19:31:42 · 797 阅读 · 0 评论 -
【DP】hdu 3664
#include #include #include #include #include #include #include #include #include #include #include #include #include #include原创 2011-09-01 16:41:51 · 516 阅读 · 0 评论 -
【按位DP】hdu 3555
dp[][0]表示不包含49并且以非4结尾的个数dp[][1]表示不包含49并且以4结尾的个数dp[][2]表示包含49的个数所以转移方程是:dp[k][0]=dp[k-1][0]*9+dp[k-1][1]*8;dp[k][1]=dp[k-1][0]+dp[k原创 2011-09-01 15:11:28 · 438 阅读 · 0 评论 -
【按位DP】
按位DP以我的理解就是在区间[A,B]内求出满足某种性质的数的个数或是最值。例如统计区间[A,B]内不含前导零且相邻两个数字之差至少为2的正整数这类问题都可以用按位DP解决。一般来说按位DP肯定有一维状态是表示当前规划到数字的前i位,那么处理i+1位的所有状态时有两种情况:1原创 2011-09-01 00:52:45 · 892 阅读 · 0 评论