摘要:²博弈取牌—记忆化搜索题目描述:有两副带有数字的牌,(数字>0)两人轮流取,取中了某张牌,自己的分数就加上牌上的数字,但只能从两端取,每人都会用最优的策略使得自己的分数最高。问A先取,他能得到的最高的分数。解法:记忆化搜索,对于第一、二副牌的左右端点分别为fr1,ta1,fr2,的情形,某个人能拿到的分数的最大值这次取走牌fr1,ta1,fr2,ta2中的最大值,牌的数目减1,问题规模被缩小。边界条件为当没有牌时为0。因为两个人都是这么思考,可抽象成一个人。当总分数为sum时,我能得到的分数会是sum-对手能拿到的分数。代码实现:intdp[N][N][N][N];//初始值为
阅读全文
摘要:先推出F(n)的公式:设dp[i]为已经投出连续i个相同的点数平均还要都多少次才能到达目标状态。则有递推式dp[i] = 1/6*(1+dp[i+1]) + 5/6*(1+dp[1]).考虑当前这一次掷色子,有1/ 6的概率投的和前面的一样,有5/6的概率不一样,不一样就要重新投,就到了dp[1]的状态,这里投了一次,所以要加1.边界有dp[0] = dp[1]+1,dp[n] = 0;可以这么说,H[n]应该是6*F[n]的,随便YY一样。更严谨的话就是一样要去推,递推式如下,设dp[i]为已经连续i次投出1后平均还要多少次才能达到目标状态。有递推式dp[i] = 1/6*(dp[i+1]+
阅读全文
摘要:题目链接:http://codeforces.com/problemset/problem/106/C根据题意列出式子,设每种蛋糕做了xi个,则对于每种材料bi*xi 2 #include 3 #define INF 0x3f3f3f3f 4 #define N 1005 5 int f[N],s[N]; 6 struct bake 7 { 8 int val,we; 9 } p[12*N];10 int main()11 {12 int n,m,we,val,cnt=0;13 scanf("%d%d%d%d",&n,&m,&we,&val)
阅读全文
摘要:题目链接:http://codeforces.com/problemset/problem/55/D数位DP题目描述:一个数能被它每位上的数字整除(0除外),那么它就是beautiful number。问区间[a,b]上有多少个beautiful number。如102就是一个beautiful number,因为它能整除1,2。14不是,因为14不能整除4.解法:数位DP,设dp[i][j][k]为累计到第i为,公倍数为j,模lcm(1,2,```,9)=2520的余数为k的数的个数。注意到两个事实,要求某个数能整除它的每一个非0位上的数字,那么等价于将这些数字求一个最小公倍数,如果这个数能
阅读全文
摘要:关于最长上升子序列的链接:http://wenku.baidu.com/view/fe0deecea1c7aa00b52acb71.htmlhttp://blog.sina.com.cn/s/blog_4b1e4fe9010098af.htmlhttp://www.cnblogs.com/celia01/archive/2012/07/27/2611043.html裸的最长上升子序列:时间复杂度为O(n*n)POJ 2533贴代码: 1 #include 2 #define N 1005 3 int a[N]; 4 int lis(int n) 5 { 6 int *dp= new i...
阅读全文
摘要:题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=29608#problem/D我把它化成了0-1背包,应该可以直接用多重背包做的,但是没有写好,所以一直算不对贴代码: 1 #include 2 #include 3 #define INF 0x3f3f3f3f 4 #define N 1005 5 int f[N],s[N]; 6 struct bake 7 { 8 int val,we; 9 } p[12*N];10 int main()11 {12 // freopen("in.c","r&
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4586解题思路:只考虑第一次,获得的金币的平均值为sum/n.sum为所有色子的面的金币值相加。对于运气好,摇中了可以再来一次,该轮就能获得m/n*(sum/n)运气好,又再来一次,该轮能获得(m/n)^2*(sum/n)无穷无尽的摇下去,一共能获得sum/n*(1+p + p^2+`````+p^k + ````),其中p = m/n将式子化简,就能得到E = sum/(n-m)。所以当sum = 0时为0,n=m时为inf。其余就为sum/(n-m)。贴代码: 1 #include 2 int
阅读全文
摘要:设dp[i][j]为有白老鼠i只,黑老鼠j只时轮到公主取时,公主赢的概率。那么当i = 0 时,为0当j = 0时,为1公主可直接取出白老鼠一只赢的概率为i/(i+j)公主取出了黑老鼠,龙必然也要取出黑老鼠公主才能赢,跑出来的老鼠有两种可能跑出来的是黑老鼠,公主赢的概率为dp[i][j] += j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3].(j>=3)跑出来的是白老鼠,公主赢的概率为dp[i][j] += j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2].(j>=2)贴代码: 1 #includ
阅读全文
摘要:解题报告链接:http://www.cnblogs.com/183zyz/archive/2012/09/13/2683524.html做法:设当有i个吸血鬼时变成n个吸血鬼的天数的数学期望为dp[i].pi为人和吸血鬼相遇的概率,pi = i*(n-i)/cn2 . cn2表示从n个人中选两个人出来的选法,那么人和吸血鬼相遇的选法为i*(n-i).p为人变吸血鬼的概率。则有dp[i] = p*pi*(dp[i+1]+1)+(1-p*pi)(dp[i+1]+1)化为:dp[i] = dp[i+1] + 1/(p*pi)有dp[n] = 0;很容易得到dp[1] = sum(1/(p*pi))
阅读全文
摘要:解题链接:http://www.cnblogs.com/183zyz/archive/2012/09/13/2683524.html这题算是概率DP里的简单题,由于各种独立,所有设dp[i][j][k]为第i个队在做到第j个题时解了k个题的概率,针对第j个题,有解出和未解出两种可能。所以就会有dp[i][j][k] += dp[i][j-1][k-1]*p[i][j]; //解出dp[i][j][k] += dp[i][j-1][k]*(1-p[i][j]);//未解出然后题目要求算每个队至少解出一个且存在一个解出的题目数>=n 的概率设p1为每个队至少解出一个题的概率,p2为每个队解出
阅读全文
摘要:先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍。再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束将这些起始位置先记录下来,然后枚举这些位置,最大的值输出,看一下代码,你就会顿悟了····哈哈。贴代码: 1 #include 2 #include 3 #include 4 #define N 1005 5 using namespace std; 6 char a[2][N],b[N];//a[0]为串a,a[1]为串b,b为串c 7 int dp1[N][N],dp2
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4669考察对取模的的理解深不深刻啊,当然还有状态的设计····设d[i][j]表示以第i个数结尾,余数为j的取法数,那么在第i个数后加一个数那么有递推式int yu =( j * log10( a[i+1] )+ a[i+1] )%k,d[i+1][yu] += d[i][j] .考虑到这是一个环这样多生成了一个余数,这个余数应该减去,还有++d[i+1][a[i+1]%k].贴代码: 1 #include 2 #include 3 #include 4 #d
阅读全文
摘要:解题报告链接:http://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html先推公式,设计状态,令DP[i]表示在房间i退出要走步数的期望值,然后推导出关系式,亮点来了,不会搜索···so,等我学会了搜索后明天再写····哈哈,已经学会了,自己设计的,和解题报告的不太一样,一个DFS解决···看代码吧···我不知道怎么说····贴代码: 1 //#define d
阅读全文
摘要:解题报告链接:http://www.cnblogs.com/183zyz/archive/2012/09/13/2683524.html另一份解题报告:http://www.cnblogs.com/kuangbin/archive/2012/10/03/2710987.html先自己推出递推式···再化简,然后解不等式即可···这个式子比较有特点,所以好解。x = ax+b。关键是求出系数a和b````我用c1记录x的临时系数,c0记录常数最后求得d[i][i] = c0/(1-c1);然后顺着推出c[i][1] --- c[i][i
阅读全文
摘要:详细的解释放苹果问题的链接:苹果可相同可不同,盘子可相同可不同,盘子可空和不可空,都有详细的说明···http://www.cnblogs.com/celia01/archive/2012/02/19/2358673.html不赘述:这里的代码是递归,记忆化搜索,避免重复计算某些数的值``` 1 #include 2 #include 3 #define N 50 4 int d[N][N]; 5 int dfs(int x,int y)//x个苹果放入y个盘子中的放法数 6 { 7 if(d[x][y] != -1) return d[x][y]; 8 if(x
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1010&cid=459找出公式,公式有实际意义,某种情形当重复做n次实验时会出现一次,即出现的概率为1/n,现在要想出现这种情形,平均要做多少次实验,显然平均要做n次。说一个具体的,比如掷色子,有6个点,6个点随机等概率出现。掷一次色子出现1的概率为1/6,现在想掷出1来,平均要掷色子多少次,即次数的数学期望是多少。可以证明:设掷i次色子才出现1的概率为p[i],则有p[1] = 1/6;p[2] = (5/6) *(1/6);第一次没有出现p[3] = (
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字符串中[i,j]位置中出现的回文子序列的个数,有递推关系:dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]如果i和j位置出现的字符相同,那么dp[i][j]可以由dp[i+1][j-1]中的子序列加上这两个字符构成回文子序列,也就是dp[i][j]+=dp[i+1][j-1],注意边界特判一下就可以了(以上摘自杭电解题报告原文)里面忘了取模,结果输出的是负数,一直
阅读全文
摘要:下面是别人的解题报告的链接,讲解很详细,要注意细节的处理。。。以及为什么可以这样做http://blog.csdn.net/woshi250hua/article/details/7824433我的代码: 1 //其中求凸包用的是Andrew扫描算法,复杂度主要为排序O(n*logn),扫描为O(n) 2 #include 3 #include 4 #define INF 100000000 5 #define min(a,b) a=3。0,1,2特判,如果有需要的话26 int andrew(point p[],int n)27 {28 sort(p,p+n);29 in...
阅读全文
摘要:下面是别人的解题报告链接:http://blog.csdn.net/accry/article/details/6607703下面是我的代码,我觉得链接中的代码有一点小问题,也许是我想错了吧。 1 #include 2 #define min(a,b) (a) < (b) ? (a) : (b); 3 #define INF 100000000 4 int dist[13][13]; 5 int dp[2050][13]; 6 void init(int n) 7 { 8 for(int i=0; i<=n; ++i) 9 for(int j=0; j<=n; ++j...
阅读全文
摘要:主要还是下面的解题报告写的。http://blog.csdn.net/accry/article/details/6607703贴代码,代码中有一些注释 1 #include 2 #include 3 int map[105]; 4 int st[70]; 5 int n,m; 6 int dp[105][70][70]; 7 int one[70]; 8 9 //数x化为二进制时1的个数 10 int countOne(int x) 11 { 12 int cnt =0; 13 while(x) 14 { 15 ++cnt; 1...
阅读全文