- 博客(15)
- 收藏
- 关注
原创 背包问题
01背包for(int i = 1; i <= n; ++i){ for(int j = V; j >= c[i]; --j) { dp[j] = max(dp[j],dp[j-c[i]]+a[i]); } }
2014-04-10 20:47:38 693
原创 最小生成树和最短路径
带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法;有向图的最短路径算法有dijkstra算法和floyd算法。
2014-04-09 12:29:43 826
原创 codeforces 414b(数位DP)
题意:一个序列B1,B2...Bl如果是好的,必须满足Bi | Bi + 1(a | b 代表a整除b), 求长度为K,元素大小小于等于N的序列个数.思路:看到数据的规模和取模1000000007就知道应该是统计类型的DP了,设dp[i][j]表示以i做结尾长度为j的序列个数.那么答案就是sum(dp[i][K] | 1dp[i][j] = sum(dp[p][j - 1] | p满足
2014-04-07 21:13:08 779
原创 POJ1088(深搜+dp)
题意:给定一个n*m的地图,0到10000的数字,寻找到一条最长的路径,该路径严格递减,延伸方式只能上下左右。思路:遍历每个点,然后进行深搜,因为路径可能会重复搜索,所以用dp来保存,当dp[x][y]>0时候,代表这个点不用延伸了,之前已经做过了,直接返回dp[x][y]就行了。#include#include int a[105][105],dp[105][105];int ma
2014-04-02 16:26:18 544
原创 离散化
离散化一般用于一个区间很大,但是给予的点很少的情况,用时间来换空间。步骤1:再输入一个坐标的时候,把他们的x,y都加入AA[tot++]=a[i].x;A[tot++]=a[i].y;步骤2:排序Asort(A,A+tot);步骤3:去重,unique()函数去掉重复的点,然后返回去重后的最后元素地址,减去A的地址,就是去重后的个数。tot=unique(A,A+tot
2014-03-31 12:54:34 606
原创 DFS与BFS
1.给定n*m地图,A,B,C,D分别为不同受瘟疫影响程度,X代表不受瘟疫影响,然后再给出I个坐标,表示该点瘟疫程度加重,当瘟疫程度为D时加重,将会向四周扩散,当四周瘟疫程度也为D时,将进行连锁反应,但每个连锁反应的D只能扩散一次,输出最后的地图。思路1:DFSvoid dfs(int x,int y){ int x1,y1,i,j; if(maze[x][y]=='X')retur
2014-03-30 00:18:33 600
原创 并查集
1.POJ1182 食物链题目大意:有三类动物互吃,编号1到M,有N句话表示他们之间的关系,1 X Y表示XY同类,2 X Y表示X吃Y,判断有多少句假话,当前的话与前面的某些真的话冲突,当前的话中X或Y比M大,当前的话表示X吃X,这3种情况都是假话。思路:这题算比较经典的并查集,要判断真话或假话,依靠的是当前给的X,Y关系与已经给过的信息是否有矛盾之处。对于当前X,Y,首先找他们的最终父
2014-03-28 23:20:12 654
原创 DP
动态规划基本重点有三:子问题、状态转移、决策。1.设有一个三角形的数塔,顶点结点为根结点,每个结点有一个整数数值。从顶点出发,在每一个结点可以选择向左下走或者向右下走,一直走到底层,要求找出一条路径,使得路径上的和最大思路:因为每个结点可以选择向左下或者右下走,最后要求得一条路径上的和最大,那么对于每个子问题来说,当前的最优解就是加上左上和右上之中最大的那个。2.给定两个字符串
2014-03-25 23:03:24 1075
原创 递归
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。其中,蜂房的结构如下所示。思路:a蜂房只能爬到a+1蜂房或者a+2蜂房,反过来说b蜂房是由b-1蜂房和b-2蜂房爬过来的。因此b蜂房的路线数就是b-1的路线数加上b-2的路线数,设s[b-a]=x,x为a到b的方案数,如果b-a==1,那可以简单知道方案数为1,如果b-a==
2014-03-23 20:42:59 849
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人