08 2012 档案
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2604题意:有 l 个人 排成一队,这l 个人可以 f(女人),也可能是 m(男人),求 这些人中 不含有 fmf 和 fff 这样的子序列的 个数.结果 % mod输入 l, mod;题解:由于L 比较大 ,我们可以求出 递推式后 用矩阵 乘法 求结果。接下来我们要考虑递推到n时新生成的E-queues,显然只考虑n-1时E-queues的最后两位的情况即可我们用 an 表示 以 开头为 fm 的数量 ,bn 表示 开头为 ff的数量 ,cn 表示 开头为 mf 的数量 dn 表示 开头为 mm 的数量。则
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2449题意 :纯高斯消元 ;输入 n 行 ,每行 n+1个数带代表 系数和 值 ai1,ai2,ai3…..ain, bi ai1*x1+ai2*x2+......ain*xn=bi求解 xi 若没有整数解 输出 分数 ,若没有解 输出 No solution.copy 别人的 高精度 Gauss (留着用)(不会java 啊 ) 1importjava.util.*;2importjava.math.*;34classfraction{5BigIntegera,b;6publicfraction(){7a.
阅读全文
摘要:http://poj.org/problem?id=1753题意:有4*4的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑->白或者白->黑)时,其周围上下左右(如果存在的话)的格子的颜色也被反转,问至少反转几个格子可以使4*4的正方形变为纯白或者纯黑? 这道题 可以 用 bfs 也可用 dfs 但在学 Gauss 就用了 Gauss,费劲 ,还有枚举 自由变量的所有可能 ,好,麻烦(因为 自由变量的值可以影响 确定的 变量的值 所以 要 枚举所有的可能 来确定最小值)。。。。。。1#include<cstdio>2#include<cstri
阅读全文
摘要:http://poj.org/problem?id=1681题意“:一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色);给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要染几次? 若 不能 染成 输出 inf。题解:和1222开关 问题一样,只不过是 将 开关 换成了 染色。E(a) = xa*A11 ^ xb*A12 ^ xc*A13 ^ S(a); E(b) = xa*A21 ^ xb*A22 ^ xc*A23 ^ S(b); E(c) = xa*A31 ^ xb*A32 ^ xc*A33 ^ S(c);将是s
阅读全文
摘要:http://poj.org/problem?id=1222题意: 题目大意:给一个5*6的01矩阵,0表示灯暗的,1表示灯亮着。矩阵中每个位置表示一个按钮,当按钮按动时它周围(上下左右)的灯变成相反的状态。问怎么按可以将所有的灯都变成暗的。题解:首先我们知道每一个灯只能按一次 ,因为 按两次 等于不安和 1830 一样 只不过是 变为了 二维,我么只要 对它门重新编号就可以了 。依然是E(a) = xa*A11 ^ xb*A12 ^ xc*A13 ^ S(a); E(b) = xa*A21 ^ xb*A22 ^ xc*A23 ^ S(b); E(c) = xa*A31 ^ xb*A32 ..
阅读全文
摘要:题意:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开 关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行 一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)题解:这题是给定N个灯的初始和最终状态,再给定一些关系,这些关系说明按某个开关可能影响其他的灯的开关情况,可以将这种关系视为一种取反的关系。 对于这题我们假设一组数据: 30 1 01 1 01 22 31 33 20
阅读全文
摘要:高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵。 高斯消元法的原理是: 若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组。 所以我们可以用初等行变换把增广矩阵转换为行阶梯阵,然后回代求出方程的解。 以上是线性代数课的回顾,下面来说说高斯消元法在编程中的应用。 首先,先介绍程序中高斯消元法的步骤: (我们设方程组中方程的个数为equ,变元的个数为var,注意:一般情况下是n个方程,n个变元,但是有些题目就故意让方程数与变元数不同) 1. 把方程组转换成增广矩阵。 2. 利用初等行变换来把增广矩阵转换成行阶梯阵。 .
阅读全文
摘要:旋转卡壳可以用于求凸包的直径、宽度,两个不相交凸包间的最大距离和最小距离等。虽然算法的思想不难理解,但是实现起来真的很容易让人“卡壳”。拿凸包直径(也就是凸包上最远的两点的距离)为例,原始的算法是这样子: Compute the polygon's extreme points in theydirection. Call themyminandymax. Construct two horizontal lines of support throughyminandymax. Since this is already an anti-podal pair, compute the
阅读全文
摘要:http://poj.org/problem?id=2187题意:最长的点对近距离的平方:题解:旋转卡壳法, 要注意的地方是,有 所有点共线的情况,所以,(求凸包时)要将,共线点去出 ;1#include<cstdio>2#include<cstring>3#include<cmath>4#include<iostream>5#include<algorithm>6#include<set>7#include<map>8#include<queue>9#include<vector>10
阅读全文
摘要:http://poj.org/problem?id=1113题意:一个城墙 有n 个点描述, 国王想建一个周长最短的墙,使墙的任意一点到城墙的距离都 > L。求这面墙的周长。题解":最短周长 = 凸包周长 + 半径为 l 的圆的周长。还要注意的是这道题 不能 将共线点去掉1#include<cstdio>2#include<cstring>3#include<cmath>4#include<iostream>5#include<algorithm>6#include<set>7#include<map
阅读全文
摘要:http://poj.org/problem?id=1228题意:一块凸包的土地,有若干钉子钉在凸包的边上,现在其中一些钉子掉掉了,判断是否能根据剩下的钉子判断出原来这边凸包的土地,能输出“YES”,不能输出“NO”。题解“首先我们要知道 ,掉了的钉子只能是 边上的点 ,而不能是 拐点,所以我们要,先求其凸包(去除 共线的点),判断每条边上 是否 除了 拐点外 还有 其他的点 ,若没条边除了拐点外都还有其他的点 ,则输出 yes,否则输出 no; 1#include<cstdio>2#include<cstring>3#include<cmath>4#inc
阅读全文
摘要:题意:给出若干个点,求出它们的凸包,并且按原点为第一点的逆时针方向输出。输出为:(0,0)(-30,-40) (-30,-50) (-10,-60) (50,-60) (70,-50) (90,-20) (90,10) (80,20) (60,30)1#include<cstdio>2#include<cstring>3#include<cmath>4#include<iostream>5#include<algorithm>6#include<set>7#include<map>8#include<qu
阅读全文
摘要:http://poj.org/problem?id=1408题意:题意:有一个长 1 的正方形框(放在x-y坐标系的0-1上),然后给出一个数 n 代表该正方形每条边上的钉子数,接下来给出这钉子的坐标(按顺序且钉子没有重合的情况),把对边上的点依次按顺序用线连接起来,得到一张不规则的网,由多 个不过则四边形构成,输出这些小四边形中面积最大一块的面积。题解:首先将 四个边的点 保存, 根据题意 ,其中的四个点求出 点集p[][];然后 在枚举多有的 多边形 得到面积的最大值1#include<cstdio>2#include<cstring>3#include<cm
阅读全文
摘要:http://poj.org/problem?id=1696题意:题意:一张图上给出n个点的坐标(xi,yi),其中xi,yi均为正整数。记这n个点中,拥有最小y的点为A,你开始从点(0, yA)开始走向点A,然后,你可以随意选择径直走去另外的点,但必须满足一下3个条件: 1:只能向左转向(也可直走)。 2:走过的路径为留下一条红色的轨迹。 3:不能越过这条红色的轨迹。 问你最多能到达几个点,并且按到达的顺序输出各个点的标号。 题解:叉积 + dfs 易证:按照一定的顺序,每次选择当前左转角度最小的点(相等则选距离最近的点),必能按条件遍历所有的点。1#include<cstdio>
阅读全文
摘要:http://poj.org/problem?id=3304题意:求是否存在一条直线,使所有线段到这条直线的投影至少有一个交点。题解“:1:把问题转化为是否存在一条直线与每条线段都有交点。证明:若存在一条直线l和所有线段相交,作一条直线m和l垂直,则m就是题中要求的直线,所有线段投影的一个公共点即为垂足。所以我们只要枚举所有的端点构成的直线 ,就可以了,叉积 判断 是否直线和线段相交。2:枚举两两线段的各一个端点,连一条直线,再判断剩下的线段是否都和这条直线有交点。证明:若有l和所有线段相交,则可保持l和所有线段相交,上下 平移l到和某一线段交于端点停止(“移不动了”)。然后绕这个交点旋转。也
阅读全文
摘要:http://poj.org/problem?id=1039题意:已知电缆是由一段段直的管道连接而成的,并知道这些管道的位置,问一束光从最左边射进来,你可以调节光入射的位置和角度,问最远能射到多远。(光束不能射穿管道) 题解:枚举 : 一个最优的 直线 可能 和 管道没有交点,(但是 我们可以经过 平移,旋转 使其 与 管道 有 交点 这样的解 同样是最优 的,我们 枚举和 管道 有两个擦点的直线 (这样 才能 做这道题)) 枚举上下两个顶点成光线所在直线,然后判断光线是否能合法,合法的话求出它射到的最远距离。1#include<cstdio>2#include<cstrin
阅读全文
摘要:题意 :求一个三角形中的 整数 点有多少个?题接:Pick定理证明:http://translate.google.com/translate?u=http://episte.math.ntu.edu.tw/articles/sm/sm_25_10_1/page4.html&hl=zh-CN&ie=UTF8&sl=zh-TW&tl=zh-CN多边形的面积 (在网格 图中): pick 定理 s = b/2 + in - 1 (b 表示 边上的点 in 表示 内部的点)边上的点数 = gcd(|x1 - x2| ,|y1 - y2|);1#include<c
阅读全文
摘要:(更新中。。。。。。。) 点 结构structpoint{ double x;//或为double double y;}浮点处理:1intdbcmp(doublex)2{3if(fabs(x)<eps)return0;45if(x<0)return-1;6elsereturn1;7}点乘:intbetweencmp(pointc,pointa,pointb)//c是否在a,b间{returndbcmp(dot(c,a,b));}doubledotdet(doublex1,doubley1,doublex2,doubley2){returnx1*x2+y1*y2;}doubledot
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4394题意:M^2%10^x=N (x=0,1,2,3....),给你一个N,求M,x为0,1,2,3....其中一个数就行了。找不到M输出None 也就是求N是某个数的平方的后缀(包括本身)。题解 : bfs 搜素每一种可能的情况 ,首先搜索 个位,然后十位 等等。。。。 1#include<cstdio>2#include<cstring>3#include<cmath>4#include<iostream>5#include<algorithm>
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4391题意:刷墙, 以开始 有 n个节点,每个节点有一种颜色 ,m 次询问m次 输入 a,l,r,z 如果 a=1 将 l到 r 刷为 z 颜色,如果 a=2 询问 l 到 r 有 多少个 和 z 相同的 节点官方题解是: 分段哈希,自己一开始想写 一下 ,单写着写着 就 觉得很麻烦 ,各中判断条件。。。。。后来改为 线段树 优化了下 ,就是加了 个 mi mx 判断 查询的颜色 是否在这里面。。。。。1#include<cstdio>2#include<cstring>3#inclu
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4393题意:n 个人赛跑,每个人有两个参数 第一秒能走的距离 f 和 第二秒 及以后 的 速度 ,求 每一秒的 冠军 (若 距离值相同 输出序号 小的)题解:直接暴力查找每秒最大值的n^2的做法会超时。 法一 考虑Fi最大只有500,所以501s之后只有 speed 对排名有影响(此时如果F也相同,则按ID顺序),排序即可。前501s暴力查找,然后直接按照排序结果输出。 法二 当 way 和 speed 呈二维不递增序列时,排名不会发生变化。排序后暴力查...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4396题意:求 从 一点s 到 e 至少经过k 条边求 最短的值是?(可以走重边);题接:二维最短路 ,d[i][k] 表示 从 s 到 i 点经过 k 条边 的最小值 ,(对于 大于k边数的值 ,并入到 dp[i][k]里 面 )1#include<cstdio>2#include<cstring>3#include<cmath>4#include<iostream>5#include<algorithm>6#include<set>7
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4385状态压缩需要好好理解啊; 又是一道 状态压缩的题 ,一开始觉的和 poj 的一道题有点像 ,特地先做了一下那个题 再回来做的这道题,结果还是没做出来 这到,最后看了 解题报告:题意:一个人在搬砖,初始位置在(x0,y0),目的地也是(x0,y0),给你n(n<=20)块砖的位置(xi,yi),规定两点之间时间耗费为欧几里德距离的平方,此人一次可以搬不超过两块砖,问你最少的时间花费并给出方案.官方题解:简单状态DP.需要注意的是,由于耗费的时间是路长的平方,所以一次性取两点的代价并不一定比分两次取小
阅读全文
摘要:http://poj.org/problem?id=2817这个题的意思是第一行给出case数N (1 <= N <= 10),然后给出N个单词,每个一行,当输入不是正整数的时候结束。每个单词最多10个字母。 Sample Input 5 abc bcd cde aaa bfcde 0 要求的是,按任意顺序排列这些单词,可以在单词前面加任意个空格,使得相邻的单词上下对应的字母数目最多,并输出最多是多少。 Sample Output 8 比如sample里面的8,是这样得来的: aaa abc bcd cde bfcde 注意只有相邻单词的字母上下对应才算对应。/*由于每两个...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4353 题意: 给你n个点,m个雷 找一个多边形,使得多边形的面积除以这个多边形内雷的个数的比值最小 仔细想想,其实就是找一个比值最小的三角形就OK了,因为其他的三角形的比值都比它大,组合成多边形后势必会将比值变大 所以可以直接暴力O(n^3)枚举三角形,再计算三角形内的雷的个数求比值即可 雷得个数的话预处理一个数组吧,画张图就懂了 cnt= (i k上方的点 )- ( i j上方的点 + j k上方的点) 当然还要取绝对值1#include<cstdio>2#include<cstring
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4380题意: 给出 n个房子的位置 。和 m个 金矿的位置 ,从 n 个房子里选出三个(组成三角形),求出有多少种选法 是 三角形 内的金矿数为 奇数?题解:预处理 枚举 从 n 个房子里 选出 2个i,j 记录 在其上方的 金矿数dp[i][j],枚举所有的三角形 那么 三角形 内的点为 fabs(dp[i][k] - dp][i][j] - dp[j][k]);1#include<cstdio>2#include<cstring>3#include<cmath>4#in
阅读全文
摘要:http://poj.org/problem?id=3613 题意:求从一个点s 到 一点 e 经过 n 条边的最短路经是多少(可以有重边):看到很难多解题报告说的是n 个点 ,其实,n 条边 应该是 n - 1 个点 题解:我们知道线性代数中有:在只 含有 01邻接矩阵 A的K次 方C=A^K,C[i][j]表示i点到j点正好经过K条边的路径数。而floyd则是每次使用一个中间点k去更新i,j之间的距离,那么更新成功表示i,j之间恰有一个点k时的最短路,如果做N - 1次floyd那么不就是i,j之间借助N - 1 个点时的最短路了当 c[i][j] > a[i][k] + a[k][
阅读全文
摘要:http://poj.org/problem?id=3735【题意】:有n只猫咪,开始时每只猫咪有花生0颗,现有一组操作,由下面三个中的k个操作组成:1. g i 给i只猫咪一颗花生米2. e i 让第i只猫咪吃掉它拥有的所有花生米3. s i j 将猫咪i与猫咪j的拥有的花生米交换 现将上述一组操作做m次后,问每只猫咪有多少颗花生?【题解】:m达到10^9,显然不能直接算。因为k个操作给出之后就是固定的,所以想到用矩阵,矩阵快速幂可以把时间复杂度降到O(logm)。问题转化为如何构造转置矩阵?说下我的思路,观察以上三种操作,发现第二,三种操作比较容易处理,重点落在第一种操作上。有一个很好的.
阅读全文
摘要:矩阵快速:由于矩阵乘法具有结合律,因此对于矩阵A,有A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。我们可以得到这样的结论:当n为偶数时,A^n = A^(n/2) * A^(n/2);当n为奇数时,A^n = A^(n/2) * A^(n/2) * A (其中n/2取整)。递归:structmartrix{intm[maxn][maxn];};martrixmtmul(martrixa,martrixb){martrixc;inti,j,k;for(i=0;i<n;i++){for(j=0;j<n;j++){c.m[i][j]=0;
阅读全文
摘要:http://poj.org/problem?id=3070 题意:已知 Fibonacci 数列 可以这样求 ,求 fn 的最后四位.题解: 矩阵的快速幂#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<set>#include<map>#include<queue>#include<vector>#include<string>#def
阅读全文
摘要:转自:http://www.matrix67.com/blog/archives/276/ 好像目前还没有这方面题目的总结。这几天连续看到四个问这类题目的人,今天在这里简单写一下。这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。不 要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。在数学中,一个矩阵说穿了就是一个二维数组。一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到 的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。比 如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是
阅读全文
摘要:http://poj.org/problem?id=3233 题意: 题意:已知一个n*n的矩阵A,和一个正整数k,求S=A+A2+A3+ … +Ak。 /*第一次写时,写挫啦,tle 一次,后来,稍微改动了一下,ac矩阵快速幂。首先我们知道 A^x 可以用矩阵快速幂求出来。其次可以对k进行二分,每次将规模减半,分k为奇偶两种情况,如当k = 6和k = 7时有:S(6) = (1 + A^3) * (A + A^2 + A^3) = (1 + A^3) * S(3)。s(7) = (1 + A^3) * (A + A^2 + A^3) + A^7 = (1 + A^3)*(s(3)) +..
阅读全文
摘要:acm.hdu.edu.cn/showproblem.php?pid=4374题意:有n层,每层有m个part。在一层中你只能向着一个方向移动(左或者右),最多能移动T步, 经过每个部分是都能得到这个部分的分数。起始位置在x位置,从第一层到最顶层能得到最多的分数题解:dp + 单调队列 ;对于 左边我们可以得到 dp[i][j] = max( dp[i - 1][k] + sum(k, j)) j - t <=k <= j;我们的队列 要维护的 就是dp[i - 1][k] + sum(k, j)由于 sum (k ,j) 单调队列要维护的状态必须是和 现在的状态 无关(或着说是
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4370题解: http://page.renren.com/601081183/note/866168965好一道转换思维的题啊,由一道,让人 不知如何下手的题,转换为了 最短路,问题,经典。。。。 我们没有想到啊,看了题解才知道,,思维有点局限啊。。。。 1001 (已更新)显然,题目给的是一个0/1规划模型。 解题的关键在于如何看出这个模型的本质。 3个条件明显在刻画未知数之间的关系,从图论的角度思考问题,容易得到下面3个结论: 1.X12+X13+...X1n=1 于是1号节...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4366题意:给你 n个点。他们有 上下级关系,一个点只有一个上级,一个上级 可以有多个下级,每个点有两个属性,能力值 、忠诚度(每个节点的忠诚度不同),求我们要删除 一个节点, 则我们 需从 其下级中选出 一个节点,其能力值 比该节点 要高,且 忠诚度是(比其能力高的下级节点中的)最高题解:首先将树状结构,转化为 线状结构, 可以遍历一遍将树上每个点标记为一维区间上的某个点,且在同一棵子树内的点是连续的一段。然后,将所有点按能力从大到小排序,能力相同的编号小的排在前面,然后扫描一遍,扫描时维护一颗线段树,(.
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4379The More The Better Time Limit: 4000/2000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 800Accepted Submission(s): 208Problem Description Given an sequence of numbers {X1, X2, ... , Xn}, where Xk = (A * k + B) % mod. Your
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4360题意:有n个点 ,m条边,没条边 哟 4 个属性 起点 u 终点v 长度 l 和 编号 k (k为 L,O,V,E 中的任意一个),求 从1 到n 点的 一条路,要求 含有完整的 1个 或多个 love 串 ,且是 最短的 每条边除了有边权以外,还有一个字母标记。标记可以是“LOVE”里面任意字符。每个点,要拆成四个点,分别代表到达该点的标记为L,O,V,E的最短路。第一步就是求最短路,直接spfa就可以了。trick在于,至少要找到一个LOVE串,在只有一个节点的时候,有几条自环,至少必须走LOVE四
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4365题意:一个 n*n的 矩阵 ,有m个 格子,已经染色,有 k种颜色可以选 ,,对剩下的格子进行染色,使得 矩阵无论 反转 或者 旋转 90 度 多少次 都不变, 一开思做这道题是,找到了 规律,以为可以 用bool 类型 存 5000*5000 的数组,但每一次 ,都要初始划,带来了很大的时间消耗,直接 tle 。。。。。。其实 可以 有结构体 来存每次将 坐标 缩小在 左上角的 下三角 内,然后 排序 ,判断 有多少 不同的即可 规律:因为满足左右上下 左右对称 ,对角线对称,所以 我们 只要 算 .
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4362做这道题是 ,一眼看出来是 dp ,写了个 一般的dp 复杂度 m*n*n 直接 tle 好伤心。。。想着怎么优化 ,但实在是不知道啊,后来看了 解题报告,明白了。。。。。官方解题报告: 设dp[i][j]表示第i批龙珠中取第j个需要花费的最小体力。dp[i][j] = min{ dp[i-1][k] + abs(pos[i-1][k]-pos[i][j]) } + cost[i][j];如果枚举k的话总复杂度位m*n*n,会超时。可以看出若每个状态只由上一层位置在其左边的状态的转移而来的话: dp[i
阅读全文
摘要:http://poj.org/problem?id=1947Rebuilding Roads Time Limit: 1000MSMemory Limit: 30000KTotal Submissions: 7061Accepted: 3092DescriptionThe cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, number 1..N) after the terrible earthquake last May. The cows didn't hav
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题目大意:一城堡的所有的道路形成一个n个节点的树,如果在一个节点上放上一个士兵,那么和这个节点相连的边就会被看守住,问把所有边看守住最少需要放多少士兵。题解:树形dpdp[r][0] 表示 以 r 为根的 子树 在 r 上 不放 士兵 的 最小值dp[r][1] 是放士兵的最小值 (他的 字节的 既可以放 ,也可以 不放)dp[r][0] = ∑ dp[j][1] j 为 r 的 子节点dp[r][1] = ∑ min( dp[j][1],dp[j][0] ) + 1;1#include<std
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2412 题目大意:n个人形成一个关系树,每个节点代表一个人,节点的根表示这个人的唯一的直接上司,只有根没有上司。要求选取一部分人出来,使得每2个人之间不能有直接的上下级的关系,求最多能选多少个人出来,并且求出获得最大人数的选人方案是否唯一。树形dp+判断 状态转移方程: 对于叶子节点 dp[k][0] = 0, dp[k][1] = 1 对于非叶子节点i, dp[i][0] = ∑max(dp[j][0], dp[j][1]) (j是i的儿子) dp[i][1] = 1 + ∑dp[j][0] (j是i的..
阅读全文
摘要:题意:一个row*col的矩阵,每个格子是0或者1,1表示土壤肥沃可以种植草地,0则不可以。在种草地的格子可以放牛,但边相邻的两个格子不允许同时放牛,问总共有多少种放牛的方法?(不放牛也算一种情况)http://poj.org/problem?id=3254 /*折腾了 半个下午 和一个晚上 ,终于 把这道 状态dp 的题给 A 了,兴奋一下。。。。前后想了 三个状态方程,前两个 被 k 掉了我的一个错的 状态方程是 dp[r] = (第 r 行 合适的状态 个数) * dp[r - 1]; dp[r] 表示 从 第 0行 到 第 r 行的最大值 这个 最后 验证是错的 ,忽略了 r-1 ..
阅读全文
摘要:http://poj.org/problem?id=1185炮兵阵地 Time Limit: 2000MSMemory Limit: 65536KTotal Submissions: 13114Accepted: 4806Description司 令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击 范围如图中黑色区域所示: 如果在地图中的灰色
阅读全文
摘要:http://poj.org/problem?id=2948意:一个row*col的矩阵,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是多少。如图所示,最北边有bloggium的收集站,最西边有 yeyenum 的收集站,要你在这些格子上面安装向北或者向西的传送带(每个格子自能装一种)。问最多能采到多少矿(yeyenum+bloggium)? 这道 dp 1A,完全自己写的,有点小兴奋,dp菜鸟在进步。。。。。。。,首先 开始想时想了一个 dp 方程 最后验证是错的;后来自己有想了一下 ,得到了正确的 状态方程dp[i][j][0] 表示 以 i,j 为右
阅读全文
摘要:http://poj.org/problem?id=2029题意: 一个 矩形内有 许多树,给你 一个 长和寬一定的 小矩形,问最多 能 用小矩形 盖住多少棵树枚举求和: 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<iostream> 5 #include<algorithm> 6 #include<set> 7 #include<map> 8 #include<queue> 9 #include<ve
阅读全文
摘要:http://poj.org/problem?id=3280又是一道 dp 题目 一开是 有点 小思路,认为他就是括号匹配的变形吗,可是后来,越想月觉的麻烦,(后来才知道 自己 向的太多了,)一开始 认为他 可以 在任意位置 插入和删除 有一定的费用 ,怎么个dp 法呀,后来看了解题报告 ,确实和 括号匹配一样,我太菜了。。。。题意: 一个字符串 求将其 变为回文串的最小花费 ,每个 字母 添加 和删除 都要一定的花费;dp[i][j] 表示 将 str[i -----j] 变为 回文串的最小花费if(str[i] == str[j]) dp[i][j] = dp[i + 1][ j - 1]
阅读全文
摘要:好纠结的一道题啊,一开始 写错了个字母 ,跳了半天,后来脚上去竟然不对,,看了 discuss 里面的 将 所有数据 改为 double 类型 秒过,汗。。。。。。。。。 棋盘分割Time Limit: 1000MSMemory Limit: 10000KTotal Submissions: 9151Accepted: 3215Description将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行) 原棋盘上每一格有一个分值,一块矩形棋盘
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4359好纠结的一道dp 题啊,比赛是 倍他的 2 的所烧次方迷惑住了 ,没想出来看了解题报告,才知道,用dp 那样做。。。, 自己还是很弱啊,想不出来通过此题我对dp 又有了 更多的了解题目大意:给你n个节点,第i个节点的权值为2^(i-1),求满足以下条件的深度为d的二叉树的个数(最后结果对maxmod=109+7取余):左子树权值之和小于右子树权值之和,当只有一个子树时可以不满足这个条件。5000个测试点,n,d<=360题解:1.首先注意f[n][d]的结果是一定的,所以先预处理出来所有的f[n]
阅读全文
摘要:二分法适用于求单调的时候用的,就比如说排序好的数组,那是递增的或者递减的。如果像出现了下图二次函数那样的怎么求他的最值呢? 二分法早就失去了他的意义了。不过还是可以用三分法来实现的,就是二分中再来二分。比如我们定义了L和R,m = (L + R) / 2,mm = (mid + R) / 2; 如果mid靠近极值点,则R = mm;否则就是mm靠近极值点,则L = m;这样的话,极值还是可以求的。具体的还是看看题目吧。三分查找的算法,对于求凸性或凹性函数的极值非常方便模版 : 1 double solve(double l,double r) 2 { 3 4 double ...
阅读全文
摘要:Party All the TimeTime Limit: 6000/2000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 926Accepted Submission(s): 341Problem DescriptionIn the Dark forest, there is a Fairy kingdom where all the spirits will go together and Celebrate the harvest every year. But there i
阅读全文
摘要:题意 :有 n个 物品 价值 为a[i],个数为 b[i];求解 能够组成m以内的多少个数题解 :可以认为 到过来想 ,容量 i 被完全装满 ,按 完全装满算 即可#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#include<set>#include<map>#define Min(a,b) a>b?b:a#define Max(a,b)
阅读全文
摘要:Capturing a country Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 380Accepted Submission(s): 164Problem DescriptionAnt and Bob two army want to capture a country. The country is consist of N cities. To capture the city i, it takes Ant A[i] minu.
阅读全文
摘要:RMQ(Range Minimum/Maximum Query)问题: RMQ问题是求给定区间中的最值问题。当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的算法效率不够。可以用线 段树将算法优化到O(logn)(在线段树中保存线段的最值)。不过,Sparse_Table算法才是最好的:它可以在O(nlogn)的预处理以后实 现O(1)的查询效率。下面把Sparse Table算法分成预处理和查询两部分来说明(以求最小值为例)。预处理:预处理使用DP的思想,f(i, j)表示[i, i+2^j - 1]区间中的最小值,我们可以开辟一个数组专门来保存f(i,j
阅读全文
摘要:其实这题用欧几里德扩展原理可以很快的解决,先来看下什么是欧几里德扩展原理: 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a = kb +r 因此d也是(a,b)的公约数 因此(a,b)和(b,a mod...
阅读全文