上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 17 下一页
摘要: 一道搜索题,不过用了一个visit数组比较重要~~值得学习!!题目大意:给3个字符串,问第三个串能不能由前两个构成,在不改变相互顺序的情况下!visit标记数组很重要,去掉must超时~~直接贴代码,代码很精简:View Code 1 # include<stdio.h> 2 # include<string.h> 3 char str1[205],str2[205],str[405],flag,visit[205][205]; 4 void dfs(int i,int j,int k) 5 { 6 if(str[i]==0 && str1[j]==0 阅读全文
posted @ 2011-07-31 09:02 奋斗青春 阅读(1163) 评论(0) 推荐(2) 编辑
摘要: 很经典的一道状态压缩DP~刚开始写这道题目的时候分析了下,很明显的二进制压缩,每行有1024中情况,但是每两个阵地之间至少要相隔2,最后一算只有60种形态。感觉不是很麻烦就写了,写着发现不对劲,由于一行需要由前面两行的状态决定,而我开的是二维数组,怎么也不能完全的把信息转换过来。。一直很纠结于怎样传递信息,最后很无奈的上网搜了下代码,发现用三维的数组就可以了。。DP[i][j][k]表示第i行当前为第j种状态,i-1行为第k种状态,那么状态转移方程就很容易搞定了。。DP[i][j][k]=max(DP[i][j][k],DP[i-1][k][h]),其中(st[j]&st[k])==0 阅读全文
posted @ 2011-07-30 19:49 奋斗青春 阅读(701) 评论(0) 推荐(0) 编辑
摘要: 哎呀,写这道题把我快恶心死啦!!!写了快一上午了,最后尽然是数组int s[21]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576};中间初始化错了,,搞得我想哭哇!!!!先判断一下,每一行可能存在17711种情况!然后每一行与上一行之间的关系:DP[i][j]=DP[i-1][k]+sum(j);i 表示第i行,j表示i行当前的状态,k表示i-1行的状态,并且j&k==0(即j与k要符合要求,上下两个点不能相邻),sum(j)表示第i行在j 阅读全文
posted @ 2011-07-30 11:04 奋斗青春 阅读(1003) 评论(0) 推荐(0) 编辑
摘要: 状态压缩DP~~题目大意:吕布大战群雄,每位英雄都有自己的攻击力,防御力,还有hp(血量),吕布比较特殊,当他积累够100的经验值时他可以升级 。。升级的话加属性。这个比较公平一点,是单挑,每一位英雄轮流与吕布作战,当吕布杀死一个英雄后,可以得到一定的经验值,问吕布能不能杀死所有的英雄,如果可以的话,求出最后能剩余的最大血量(可以参考,打dota时比较有用的。。^_^)思路:比较裸的状态压缩DP,直接二进制转换。一般的状态转移方程就可以了。虽然把这道题A了,但是我感觉这样做缺乏正确性,参见http://acm.hdu.edu.cn/discuss/problem/post/reply.php? 阅读全文
posted @ 2011-07-29 19:35 奋斗青春 阅读(523) 评论(0) 推荐(0) 编辑
摘要: 在hdu上随便找了一题做,没想到竟然是状态压缩DP。开始有一句话没看清楚“But Mr Acmer gets bored so easily that he doesn't want to visit a city more than twice!”,我以为每个城市只能访问一次呢,用二进制怎么搞都不对,上网上搜,都说是三进制,我很不解,这跟三进制有什么关系吗?最后又读了几遍题,把这个错误给发现了。。三进制思想和二进制一样,只不过多了一种状态,其他的都一样。题目大意:加限制的最小生成树,限制条件:每个节点最多只能到达两次。代码:View Code 1 #include<stdio. 阅读全文
posted @ 2011-07-29 11:13 奋斗青春 阅读(742) 评论(0) 推荐(0) 编辑
摘要: 二进制 状态压缩DP。题目大意: 有n份作业需要做,每一份作业都有 一个截至时间和一个耗时(完成该作业需要的时间),每份作业每逾期一天就扣掉一分,要求完成所有作业并扣掉最少的学分,并把完成作业的顺序输出出来!很早之前就写过这道题,当时以为是道水题,直接贪心求解,一直WA,后来找到了一个反例,发现贪心真的不行,就放那了。这两天学了下状态压缩DP,把这道题给搞出来了。思路:二进制状态压缩,1表示该作业已经完成,0表示未完成,而n最大15,也就是说最多只有2^15种状态。把这2^n种状态遍历一遍就可以了,s表示其中一个状态,ans表示s的二进制有多少个1, 所以s可以由ans种方式到达,在这ans种 阅读全文
posted @ 2011-07-29 11:04 奋斗青春 阅读(975) 评论(0) 推荐(1) 编辑
摘要: 简单树形dp!§题目大意: §一城堡的所有的道路形成一个n个节点的树,如果在一个节点上放上一个士兵,那么和这个节点相连的边就会被看守住,问把所有边看守住最少需要放多少士兵。 dproot[ i ]表示以i为根的子树,在i上放置一个士兵,看守住整个子树需要多少士兵。 §all[ i ]表示看守住整个以i为根的子树需要多少士兵。然后直接树形DP就ok了,不过某人给了个很好的思考题,假如把守边改为守点,该怎样处理呢?我想了一个方法,不知可行不可行:dp[i][1]表示i节点处 放士兵使 以i为根的树都能守住 ,dp[i][1]=1+min(dp[j][1],dp[j][ 阅读全文
posted @ 2011-07-27 20:08 奋斗青春 阅读(368) 评论(0) 推荐(0) 编辑
摘要: 树形DP+一个判断。题目大意:n个人形成一个关系树,每个节点代表一个人,节点的根表示这个人的唯一的直接上司,只有根没有上司。要求选取一部分人出来,使得每2个人之间不能有直接的上下级的关系,求最多能选多少个人出来,并且求出获得最大人数的选人方案是否唯一。前半部分很容易求得,直接一个树形DP,后面的判断最优解是否唯一比较难搞。。看了roba的ppt顿时恍然大悟。§新加一个状态dup[i][j],表示相应的dp[i][j]是否是唯一方案。 §对于叶子结点, dup[k][0] = dup[k][1] = 1. §对于非叶子结点, –对于i的任一儿子j,若(dp[j][0 阅读全文
posted @ 2011-07-27 19:00 奋斗青春 阅读(2051) 评论(0) 推荐(0) 编辑
摘要: 很简单的一道树形DP,把我搞得太纠结了。。。。我也知道需要把子树的情况进行背包,不过不知道该怎样写,看了别人的代码,也能明白,就是自己那个时候怎么没想起来呢。。。题意:给一个包含n个节点的树,然后让你找一颗节点数为p的子树,同时让你删掉最少数目的边把这个子树给孤立起来,问这个最少的边数。思路:很容易想到要用到01背包,要把子树的情况进行背包。用dp[root][j]记录 以root为根的、节点数为j的子树的孤立起来需要删除的最少的边数。状态方程为:dp[root][p]=min(dp[root][p], dp[u][k]+dp[root][p-k]-2);(其中u为root的一个孩子)由于u与 阅读全文
posted @ 2011-07-25 16:12 奋斗青春 阅读(810) 评论(0) 推荐(0) 编辑
摘要: 去年成都现场赛的题!!再次强调一下,2-sat箴言:如果a与b矛盾,则建边(a,b');到n-1表示0,n到2*n-1表示1 if(C[i]==0) add(x,y+n);add(y,x+n); if(C[i]==1) add(x,y);add(y,x);add(x+n,y+n);add(y+n,x+n); if(C[i]==2) add(x+n,y);add(y+n,x);二分枚举可以到的最大dep值,然后建边用2-sat判断是否可行。贴下我的代码:View Code 1 # include<stdio.h> 2 # include<string.h> 3 # 阅读全文
posted @ 2011-07-24 09:52 奋斗青春 阅读(963) 评论(2) 推荐(1) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 17 下一页