03 2013 档案
摘要:题目链接:http://poj.org/problem?id=2352 水题。。。 1 //STATUS:C++_AC_204MS_696KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector>10 #include<queu
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1693 插头DP的入门题,属于轮廓动态规划一类,推荐看《基于连通性状态压缩的动态规划问题》,陈丹琦写的,Orz女神... 1 //STATUS:C++_AC_0MS_272KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #inc
阅读全文
摘要:题目链接:http://poj.org/problem?id=1160 f[i][j]表示前 i 个村庄放 j 个邮局的最小花费,w[i][j]表示 i-j 村庄之间放一个邮局的最小花费,则转移方程:f[i][j]= Min{ f[k][j-1] + w[k+1][i] },把f[i][j]转换一下,表示前 j 个村庄放 i 个邮局的最小花费,则 f[i][j]=Min{ f[i-1][k] + w[k+1][i] }。 四边形不等式优化有如下定理: 1.当决策代价函数w[i][j]满足w[i][j]+w[i’][j’]<=w[I;][j]+w[i][j’](i<=i’<=j
阅读全文
摘要:题目链接:http://poj.org/problem?id=2355 简单的DP,转移方程:f[i][j]=Min { f[i][k] + C(n) },注意到f[i][j]是单调递增的,用二分搜索优化即可。注意到此题有个trick,那就是s>e!!! 1 //STATUS:C++_AC_16MS_252KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #inclu
阅读全文
摘要:题目链接:http://www.acdream.net/problem.php?id=1083 简单数位DP,貌似我写得太暴力了= = 1 //STATUS:C++_AC_20MS_1512KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vec
阅读全文
摘要:题目链接:http://poj.org/problem?id=2374 这个题目坑了好久啊,题意看错了,bs自己。 其实不难的,状态方程容易相处来,每个fence只有两种状态,即左边下去和右边下去,如果要知道当前状态的最优情况,就必须知道前面所有状态的最优情况,最坏情况下复杂度O(n^2)。但显然可以发现前面有很多的状态都不能到达当前状态于,因为前面的有些状态被覆盖了,于是我们可以用线段树来优化,在log(n)的时间里找到可以到达当前状态的fence。虽然在log(n)的时间里找出了状态,但是还是有比较多的状态,还可以继续优化。注意到编号为 i 的fence和所有编号为 1,2,,,,...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555我的DP方程:f[i][j]表示数的第i位以j开头的数含有49的个数,则状态转移方程为: 1.j!=4时: f[i][j]=sum{ f[i-1][k] | 0<=k<=9 } 2.j==4时:f[i][j]=sum{ f[i-1][k] | 0<=k<=9 } - f[i-1][9] + pow(10,i-2) (因为j=4时,只要i-1位为9,后面的都满足)这样的转移方程思路比较清晰,在网上看到别人的转移方程是这样的: 1.f[i][0]=10*f[i-1][0]-
阅读全文
摘要:题目链接:http://poj.org/problem?id=3345 国家之间可能存在依赖关系,可以求出每个国家向下的每种情况的最优消费,即f[u][i]表示节点为u时选择i个国家的最优消费。自底向上更新时就是分组背包问题了: f[u][i]=Min{ f[u][i],f[u][i-j]+f[v][j] | v为u的儿子节点,0<=j<=v子树的节点数 },其实本来是3维的,不过这里用滚动数组优化了。 1 //STATUS:C++_AC_16MS_588KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #inclu
阅读全文
摘要:题目链接:http://poj.org/problem?id=3280 典型的区间DP问题,fp[i][j]表示第i-j个字符经过修改后的最优值,则状态转移方程如下: f[i][j]=Min(f[i][j],f[i][j-1]+Min(cost[s[j]][0],cost[s[j]][1])); f[i][j]=Min(f[i][j],f[i+1][j]+Min(cost[s[i]][0],cost[s[i]][1])); if(s[i]==s[j]) f[i][j]=Min(f[i][j],f[i...
阅读全文
摘要:第一种#define _________ }#define ________ putchar#define _______ main#define _(a) ________(a);#define ______ _______(){#define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)#define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)#define ____ _(0x72)_(0x6C)_(0x64)_(0x21)#define _____ __ ___ ____ _________#include<std
阅读全文
摘要:直接贴了: 1 #define LOCAL 2 3 /** ` Micro Mezzo Macro Flation -- Overheated Economy ., Ver 0.1 **/ 4 5 #include <functional> 6 #include <algorithm> 7 #include <iostream> 8 #include <fstream> 9 #include <sstream> 10 #include <iomanip> 11 #include <numeric> 12 #in
阅读全文
摘要:题目链接:http://poj.org/problem?id=2684 属于比较水的计算几何题目,直接叉积判断即可。 1 //STATUS:C++_AC_0MS_192KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector>10 #
阅读全文
摘要:题目链接:http://poj.org/problem?id=2155 比较典型的二维线段树题目,直接永久更新即可,在询问的时候,要询问每个x区间的子树,复杂度O(log(n)^2)。 也可以用树状数组搞,推荐看NOI 2009武森《浅谈信息学竞赛中的“0”和“1”》。 1 //STATUS:C++_AC_907MS_16144KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 //#include<math.h> 6 #include<iostream>
阅读全文
摘要:题目链接:http://poj.org/problem?id=2754 当时居然没有想到是多重背包,敲了个分组背包,TLE。。。 后来才知道可以转化为多重背包,即把每个下界L[i]放为0,上限为U[i]-L[i],就是物品的个数,价值为P[i],花费为M[i]。本来题目要求Σ(M[i]*Table[i])=0时,Σ(P[i]*Table[i])的最大值。现在Table[i]的每个值都加了-L[i],即Σ(M[i]*Table[i] + M[i]*L[i]) 时,Σ(P[i]*Table[i] + P[i]*L[i])的最值,由Σ(M[i]*Table[i])=0可知,背包的容量为Σ(M...
阅读全文
摘要:Codeforces Round #171 (Div. 2) 搞完(题解) Codeforces Round #168 (Div. 2) 差E ( 题解 )
阅读全文
摘要:A.yy题,分情况讨论比较方便,详见代码。View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 #include<iostream> 6 #include<string> 7 #include<algorithm> 8 #include<vector> 9 #include<queue>10 #include<stack>11 using nam
阅读全文
摘要:A.模拟。 B.数据小,模拟。 C.给定一个数组,要求使得数组中不存在两个数相差k倍,问数组中最大的数的个数。先排序,然后从前往后找倍数相差为k的数,二分查找。View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 #include<algorithm> 6 #include<string> 7 #include<queue> 8 #include<stack> 9 #i
阅读全文
摘要:题目链接:http://poj.org/problem?id=2353 状态方程:f[i][j]= Max{ Max{ sum[j]-sum[k-1]+f[i-1][k] | k<=j } , Max{ sum[k]-sum[j-1]+f[i-1][k] | k>j } }。复杂度O(n*m^2),如果不优化的话会TLE。分离状态转移方程: 1,k<=j 时,f[i-1][k]-sum[k-1]; 2,k>j 时,f[i-1][k]+sum[k]; 即把与j相关的分离出来,那么维护一个前缀最小和后缀最小就可以了,并且记录位置。 1 //STATUS:C++_AC_172
阅读全文
摘要:题目链接:http://poj.org/problem?id=3034 此题的状态方程很容易想出来,以时间为阶段划分,然后地图为状态,f[k][i][j]=Max{ f[k-1][x][y]+t | t=sum( map[k][p][q] && (p,q)在线段(i,j)-(x,y)上 }。 转移的时候用点小技巧就可以了,就是先把通方向上的单位整数向量求出来,在更新的时候逐个用 n*单位整数向量 (n满足距离不超过d) 来更新f[k][i][j],最后遍历一遍最值。 此题有一个很坑的trick:hammer可以在正整数坐标轴的外面,很坑啊有不有!!!足足贡献了4个WA= = 1
阅读全文
摘要:题目链接:http://poj.org/problem?id=3612 状态转移方程容易想出:f[i][j]=min{ f[i-1][j]+c*(j-k)+(j-h[i])^2 | h[i-1]<=k<=maxh && h[i]<=j<=maxh },k为上一个pole的可能高度,maxh为所有poles的最高高度。 可以算出上面的转移方程复杂度是O(n*100*100),铁定超时。仔细想下还是可以优化的。我们其中(j-h[i])^2与上一个状态无关,可以忽略。只剩下f[i-1][j]+c*(j-k)了,其f[i-1][j]是常数,而c*(j-k)是变量
阅读全文
摘要:题目链接:http://poj.org/problem?id=1947 题目要求,在一颗树上,求一个点数为n的联通分支最少需要截断的边的个数。 容易想到状态转移方程f[u][j]=Min{ f[v][k]+f[u][j-k] | 1 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #include11 #include12 using namespace std;13 #define LL __int6414 #define pdi pair15 #define Max(a,b...
阅读全文
摘要:题目链接:http://poj.org/problem?id=3590 自己暴力给水过去了,不过效率有点低。题目要求的就是给一个数n,要你求出一种方案,一些和为n的数的最小公倍数最大。题目数据量不大,容易想到用暴力的办法求出所用情况,然后比较就可以了,然后再剪下枝就可以过了。不过有更好的方法。和为n的数的最大公倍数可以用DP求出来:f[i][j]表示和为i的数划分为j个循环节时的最大公倍数,则f[i][j]=max{f[i-k][j-1] | j-1<=k<i-1};然后就是求最小的置换了。设n的最大公倍数是m,则有p1^k1*p2^k2*……*pn^kn=m,显然有p1^k1+p
阅读全文
摘要:题目链接:http://poj.org/problem?id=1322 比较水的DP,只是精度有点坑。f[i][j]表示放置i次后,桌子上有j个chocolate的概率。显然,f[i][j]=sum{f[i-1][j-1]*(c-j+1)/c+f[i-1][j+1]*(j+1)/c};但是如果不优化,会超时,注意到f方程式随着i的增大是收敛的,所以当n很大时,只要计算前面就可以了,大概1000足够。我做的时候是比较精度fbs(f[i][j]-f[i][j-2])<esp,这样求出来c=100时,大概只要500次,但WA了,证明还是不足够收敛。显然这里还可以用滚动数组优化。 1 //STA
阅读全文
摘要:题目链接:http://poj.org/problem?id=3254 状态压缩,用01分别表示pasture不能plant和能plant。转移方程:f[k][i]=sum{f[k-1][j] | j是能满足i的状体,不产生冲突},显然可以用滚动数组优化。 详细的转移方法(上一个的状态设为k,i为所在行数): 1,如果前一个pasture已被plant,那么下一个pasture必定不能plant,所以f[i][k&~(1<<j)]+=f[i-1][k]; 2,如果前一个pasture没有plant: a,下一个pasture不plant,那么f[i][k]+=f[...
阅读全文
摘要:题目链接:http://poj.org/problem?id=2411 啪啦啪啦敲了80+行,1A。结果看Discuss,别人20行就解决了= =!,果然是我想复杂了。我的状态压缩效果不是很好,貌似很挫,因为状态考虑得太多了,没有类化,用了2bit的空间来表示每个格子的状态即当前放的是横向01,没放00,竖向11。而且状态转移的时候考虑的是从后面来判断前面的状态是否可行,这样的话每行就多记录了些状态(需要记录格子为空的情况)。 其实简单的做法就是从前一状态推向后一状态,用0表示当前格子放置了,1表示当前格子放置的是竖向的,而且是向下凸出的。状态转移方程:f[k][i]=sum{f[k-...
阅读全文

浙公网安备 33010602011771号