上一页 1 ··· 6 7 8 9 10 11 12 13 14 15 下一页
摘要: 为了学习高斯消元写了下这一题,代码是按照维基百科的伪代码来写的,每个点的状态和他自己以及周围五个点是否按下有关,于是只要每个点作为一个未知数,列出30个方程,用高斯消元求解即可。 其实这题完全可以不必用高斯消元,枚举第一行的状态就可以了,第一行的状态可以决定第二行的状态,进而就可以决定整幅图的状态。 1 #include <string.h> 2 #include <stdio.h> 3 #include <algorithm> 4 #include <stdlib.h> 5 int cas,n,m,x[50][50],ans[31]; 6 vo 阅读全文
posted @ 2012-08-31 19:22 Burn_E 阅读(287) 评论(0) 推荐(0)
摘要: 有三个面数不同的骰子,每次得分为三个骰子的点数和,但当三个骰子的点数满足某个条件时,分数会清0,问分数大于N需要投掷次数的期望。 典型的期望题,但是有环。论文中说这种题一般用高斯消元通解,但是这一题比较特殊,所有的环都是回到0点,所以可以将每个点的期望化简到一个关于E[0]的线性方程租,然后求系数即可。 1 /* 2 设E[x]为x分时到达n分的期望投掷次数,pk为掷到k分的概率,p0为回到0分的概率 3 有E[x]=∑E[x+k]*pk+p0*E[0]+1 4 假设E[x]=A[x]*E[0]+B[x] 5 则 E[x]= ∑(A[x+k]*E[0]+B[x+k])*p[k]+p... 阅读全文
posted @ 2012-08-31 15:59 Burn_E 阅读(221) 评论(0) 推荐(0)
摘要: 一个连通的图上有一只猫和老鼠,猫每次能移动一步,会选择到老鼠的最短路去移动,如果有多个选择,移动到标号最小的一个点。如果一步没有抓到老鼠的话,猫可以连续继续移动一步。接着老鼠会随机移动到他附近的一个点或者留在原地,每种移动的概率是1/(该点的度+1)。求猫平均几次可以抓到老鼠。 p[i][j]表示猫在i老鼠在j猫下一步会选择的点,对每个点bfs一遍可以预处理出来。f[i][j]表示猫在i,老鼠在j猫抓到老鼠的期望,则有 f[i,i]=0,p[i,j]==j或者p[p[i,j],j]==j时f[i][j]=1。 1 #include <string.h> 2 #include < 阅读全文
posted @ 2012-08-31 14:35 Burn_E 阅读(360) 评论(3) 推荐(0)
摘要: 为了理解期望DP做的第一道期望题。 一共有s个子系统和n个bug,一次能找一个Bug,求出在s个子系统中发现n个Bug的期望次数。bug是无穷的,所以认为每次在每个系统找找到一个Bug的概率是相等的。 这种题目基本都是设E(now)为从当前状态到达结束状态的期望,E(now)=∑E(x)p(x),x表示可以从now转移到的状态,p[x]表示转移到这个状态的概率。 1 /* 2 s个子系统,n个bug, 3 e[i][j],在i个子系统中发现j个bug到达目标的期望,显然d[s][n]=0; 4 e[i][j]可以转化成四种情况 5 发现无用的bug e[i][j... 阅读全文
posted @ 2012-08-31 10:16 Burn_E 阅读(260) 评论(0) 推荐(0)
摘要: 看了大牛的代码,在斌牛的指导下,终于AC了这题。 题目很短,就是问一个由大写字母组成的矩阵中有多少个不同的子矩阵。 从1到m枚举宽度,对每个宽度进行HASH,hash[i][j]表示s[i][j...j+width-1]这个串的hash值,然后再将hash值按照hash[i][0],hash[i+1][0]..hash[n-1][0],#,hash[i][1]...hash[n-1][1],这样竖着的顺序连接起来。并在每一列的串之间用一个符号隔开,这样形成了一个串,再求这个串的不重复子串有多少个,最后将所有宽度的不重复子串和加起来就可以了。这个应该比较容易理解,当枚举宽度为width时... 阅读全文
posted @ 2012-08-31 00:14 Burn_E 阅读(347) 评论(0) 推荐(0)
摘要: Continuous Same Game (2)是个很BT的搜索,这题是为了做(2)才来做一下的。其实直接模拟很easy的,纯属无聊写了个位运算版本的,感觉效率似乎差不多。。就是用3位表示每一位的状态,这样一个longlong就可以存下一列的状态。 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 typedef long long LL; 5 LL d[22],nfull[22],full[22]; 6 int di[]={-1,1,0,0},dj[]={0,0,1,-1} 阅读全文
posted @ 2012-08-30 14:00 Burn_E 阅读(247) 评论(1) 推荐(0)
摘要: 维护两个字符串,操作一可以将其中一个字符串的一个字符进行修改,操作二是查询从某一位开始的最长公共串。 这题比较简单,只要维护一个数组,0表示两个字符串该位字符相同,1表示两个字符串该位字符不同。用树状数组维护前缀和,用sum(i)表示前i个元素的和,如果要查询从第i位开始的最长公共串,只要求满足sum(x)-sum(i)==0的最大x即可,二分去找这个x就行了。复杂度比线段树去做多一个二分的log(N),但是线段树常数比树状数组大不少,所以实际效率是差不多的,而且代码要好写很多。 1 #include <stdio.h> 2 #include <string.h> 3 阅读全文
posted @ 2012-08-29 19:50 Burn_E 阅读(251) 评论(0) 推荐(0)
摘要: 题目大意是说给你一个起点和终点,一个人要从起点走到终点,它不能经过一个点两次,问他不可能经过哪些点。 显然转化成能经过哪些点要好想一些,用N减去能经过的点就可以得到答案。下面的讨论都是基于求他可能经过的点有多少个。 很容易想到用双联通分量,但是建图确实比较麻烦。如下图,一个人想要从1走到3,那它可能在的点就是1,2,3。因为2是一个割点,它如果从2走到了4,想要到达3就必须再经过2,所以可以用割点和双联通建图。 用割点和双联通可以建成双联通与割点相邻的图,若右图所示。可以证明这是一棵树,因为如果存在环,这个环必然可以缩成一个点,树中任意两点有且仅有一条路径,于是只要统计这条路径上有一... 阅读全文
posted @ 2012-08-29 19:32 Burn_E 阅读(716) 评论(0) 推荐(0)
摘要: 题目基于一个定理:当所有点相连的点的个数大于N/2时,一定可以构造出一条哈密顿回路,构造的复杂度是N^2。 这题的正解是构造,但很多人都是搜索过的,只能说明这题的数据比较水。sgu上有一道基本一样的题目(sgu122),这一题不用构造是过不了的。 至于构造方法,也就是3步。 STEP1:先找两个相邻点s-t,扩充出一条链直到到不能扩充为止。 STEP2:这时如果s-t不相邻,在链上找一点vi满足s与next[vi]相邻并且vi与t相邻,链转化为s-vi-t-next[vi]-s,根据鸽巢原理这个点必然存在。 STEP3:如果链中的点不足N个,就在环上开一个新口继续加点,重复STE... 阅读全文
posted @ 2012-08-29 02:15 Burn_E 阅读(362) 评论(0) 推荐(0)
摘要: 题解说是容斥原理,彻底没看懂,搜到的题解也是各种简洁,就提到是容斥原理,难道大家的数学都这么好,一眼就看懂了。。。。 这题也可以用概率DP做,相比之下这种做法要容易理解的多。用一个状态表示当前抽到的卡片的状况,1代表尚未拿的卡片,有d[now]=x*d[now]+sigma(si*pi*(now^(1<<i)))+1,si表示stat中该位是0还是1,x表示停留在该状态的概率,即没拿到其它卡片的概率(没抽到卡片+抽到当前已有卡片),移项可以得到d[now]=sigma(..)/(1-x)。 1 #include <string.h> 2 #include <std 阅读全文
posted @ 2012-08-29 01:56 Burn_E 阅读(232) 评论(0) 推荐(0)
上一页 1 ··· 6 7 8 9 10 11 12 13 14 15 下一页