07 2015 档案

摘要:其实巨水...然而 不用scanf prinf 根本过不了.....真无聊第一版代码有点问题 效率不高 主要是考虑到这个家族有可能一开始就是个森林 不是从树里分出去的实际上数据点还是一棵树 然后变成的森林 这样的话只要三个数组就可以了alive记录是否活着sons记录每个人的子节点个数father记... 阅读全文
posted @ 2015-07-29 00:46 雨尘之林 阅读(660) 评论(0) 推荐(0)
摘要:字符串水题, 但是最后一步关于计算重复度的还是很好玩的地方。另外就是注意代码简洁性、可读性的练习。#include #include #include using namespace std;char getNumber(char c){ if(c=='-' or c=='Q' or c=='... 阅读全文
posted @ 2015-07-29 00:41 雨尘之林 阅读(464) 评论(0) 推荐(0)
摘要:http://acm.sjtu.edu.cn/OnlineJudge/problem/4020一上手就来了一个删点 排序+DFS.... 虽然正确性没问题 但是超时 只有60分. 主要在于不知道怎么减少搜索量思路就是删除一些肯定不能在的点, 然后经过条件判断 DFS地去搜索最长的路径#include... 阅读全文
posted @ 2015-07-29 00:36 雨尘之林 阅读(744) 评论(0) 推荐(0)
摘要:#include #include #include #include using namespace std; int k,n,m; bool map[1000+5][1000+5]; bool vis[1000+5][1000+5]; int dx[4] = {0,0,-1,+1}; int dy[4] = {+1,-1,0,0}; void init(){ cin>>n... 阅读全文
posted @ 2015-07-29 00:10 雨尘之林 阅读(493) 评论(5) 推荐(0)
摘要:这个题只用BFS来搜索一次会很麻烦, 因为每次经过一个宝藏之后,要把所有的vis重置(因为可以重复经过同一点, 但是这样会有很多不必要的路径)看题目的暗示 最多只有5个宝藏 我们要把所有的宝藏收集齐全, 如果确定了收集的顺序, 那么也就确定了路径那么可以知道 A55的排列一共是120种路径 遍历起来... 阅读全文
posted @ 2015-07-29 00:07 雨尘之林 阅读(768) 评论(0) 推荐(0)
摘要:...被输入给坑了 应该先把所有的空格删掉再玩 还有就是测试点里好像根本就没有关于后结合的事情...不过后结合也很简单 控制一下优先级的判断即可.中缀表达式的处理核心就是两个堆栈的维护一个是 操作符栈一个是 操作数栈只有当 当前正在处理的操作符的优先级大于(不考虑后结合时) 栈顶操作符的时候, 才进... 阅读全文
posted @ 2015-07-28 23:57 雨尘之林 阅读(512) 评论(0) 推荐(0)
摘要:和石子合并很像, 为了对环状进行处理, 我们可以把输入数据复制一份接连在后边. 这样在最后的结果枚举起点找最大即可.注意这里代价的计算, 因为我们的data[i]只记录了珠子的头 , 珠子的尾部即是下一个珠子的头部.//因为计算dp[i][j]时需要用到dp[i][k]k比j小 所以j要顺序DP也需... 阅读全文
posted @ 2015-07-25 00:35 雨尘之林 阅读(368) 评论(0) 推荐(0)
摘要:简单的DP, 处理的时候尽量用len从1到n) , i 从 1 到 len-n] 来遍历.注意这个时候 len 表示的是从i开头之后接连len个元素组成的序列for (int i = n-1; i >=1 ; --i){ for (int j = i+1; j <= n ; ++j){ ... 阅读全文
posted @ 2015-07-25 00:16 雨尘之林 阅读(249) 评论(0) 推荐(0)
摘要:此题倒是能用贪心骗点分...其实对于每一个位置 , 我们知道最后的改善结果一定是原数列中的数 .(因为要尽量减少消耗, 可以考虑减小至和相邻的相同) 有了这个结论之后, 我们就考虑用dp来做这件事情首先 存下所有数据于 data[]排序data 得到 data_sort[]然后用dp[i][j]来表... 阅读全文
posted @ 2015-07-24 23:35 雨尘之林 阅读(545) 评论(0) 推荐(0)
摘要:更新...最后发现根本不用在循环中判断是否是素数, 因为先除的肯定是素数, 后面的以该素数的倍数组成的合数早就被除没了.....//新的build() 注意最后一位的处理void build(){ int sq = sqrt(ori); int i; for (i = 2;... 阅读全文
posted @ 2015-07-22 15:29 雨尘之林 阅读(473) 评论(0) 推荐(0)
摘要:这个要把dp[i]的状态分成两类 第一类是以)结尾的, 第二类是以a结尾的.#include using namespace std;const int mod = 19301; unsigned long long dp[10000];int n;void build(){ dp[0]=1;... 阅读全文
posted @ 2015-07-22 15:18 雨尘之林 阅读(388) 评论(0) 推荐(0)
摘要:这个DP要用状态分类下标的思想, 把dp[i]分成dp[i][0]和dp[i][1]来处理 0表示不翘课 1表示翘课, 这样可以更好的利用逻辑关系高精度就不放在这里了,只有核心代码int main(int argc, char const *argv[]){ int n; cin>>n;... 阅读全文
posted @ 2015-07-22 15:16 雨尘之林 阅读(375) 评论(0) 推荐(0)
摘要:优先队列自动解决了动态排序问题,非常好用。。。#include #include #include #include using namespace std;int n;int seeds[10000];int presum[10000];priority_queue,greater > q;voi... 阅读全文
posted @ 2015-07-22 15:08 雨尘之林 阅读(455) 评论(0) 推荐(0)
摘要:水题也要优化效率嘛1.用两个数组单独记录下标的更新2.用STL中lower_bound来进行二分查找.要注意lower_bound的返回值意义 是大于等于val的第一个,所以返回值要进行判断才可以利用#include #include #include #include using namespac... 阅读全文
posted @ 2015-07-20 17:26 雨尘之林 阅读(697) 评论(0) 推荐(0)
摘要:dp[i][j][k][l]表示同时从(1,1)到(i,j)和从(1,1)到(k,l) 的 最大热心程度。(= = 三维的优化 有时间在搞。。)注意这里有个地方和别人不太一样,我是判断如果终点重复的时候,直接减去一次那个点得好心度,表示有一条经过时该位置的人的好心度是0;#include using... 阅读全文
posted @ 2015-07-20 16:00 雨尘之林 阅读(535) 评论(0) 推荐(0)
摘要:扫雷玩得好还是有点好处的......这个题一开始像从后向前按照第一排的数字进行DFS 发现自己真傻,先不说这种情况下每个数字的填写情况很多, 还要处理相邻位置的问题。所以可以对每一位有没有地雷进行枚举。处理每一位的时候,要保证上一个数字是合理的,否则不用进行下去了,类似回溯,注意have变量的处理就... 阅读全文
posted @ 2015-07-20 15:54 雨尘之林 阅读(383) 评论(0) 推荐(0)
摘要:一开始用了模拟的方法,DFS来搜索,但是因为当n很大的时候有很多的重复计算,因为会踏过重复的点进行重复的操作,而且不能不走这些重复的路径,因为没有存储结果,最后只过了三个点。考虑到重复的路径,所以想到利用动态规划。可以认为dp[i][j]表示的是 从左上角开始走,走出以(1,1)到(i,j)为两个端... 阅读全文
posted @ 2015-07-18 15:01 雨尘之林 阅读(596) 评论(0) 推荐(0)
摘要:一开始想贪心,类似启发式搜索的感觉...后来觉得不行,而且很难写。不如就枚举。可以通过0到2^W的中的每一个数的二进制形式来对应,第一行每个位置是否作为中心点放入十字格子的情况。当此处为0时表示不放,1时表示放。为什么只枚举第一行的所有情况就可以了呢。因为第一行的情况确定之后,我们可以通过推理先改变... 阅读全文
posted @ 2015-07-18 14:24 雨尘之林 阅读(462) 评论(0) 推荐(0)
摘要:Description小M有很多个机器人,他们要么一直说真话,要么一直说假话。然后每个人都说:(1). 不到N个人比我工作得多(2). 至少M个人的工资比我高。保证没有两个人的工作一样重,也没有两个人的工资一样高,问至少有多少机器人?Input Format一行两个数整数N, M (1≤N,M< 2... 阅读全文
posted @ 2015-07-15 10:49 雨尘之林 阅读(639) 评论(0) 推荐(0)
摘要:非常简单的DP如果dp[i,j]表示从0到i 和 从0到j 这两段的相似度,那么可以知道每个dp[i,j]是由三种状态转化过来的第一种 当dna1[i]==dna2[j]的时候dp[i-1,j-1] + 1 长度加1第二种 否则 从下面两个状态过来那就是dp[i][j-1] 和 dp[i-1][j]... 阅读全文
posted @ 2015-07-15 10:11 雨尘之林 阅读(442) 评论(0) 推荐(0)
摘要:这个题第一眼以为只是一个简单的序列型DP问题,于是快速的写下了下面的代码。#include using namespace std; /* 看着只是简单的序列DP..不知道有没有坑 DP[k]表示的是有前k个活动可以选择时的答案 */ struct state{ int health;//体力... 阅读全文
posted @ 2015-07-10 17:00 雨尘之林 阅读(573) 评论(0) 推荐(0)
摘要:这个题很多地方暗示了DP的路径。我们处理时,dp[i][j]可以认为是从i坐标到j坐标的序列达到回文效果需要的最小代价,以此向外扩展,最终得到dp[0][M-1]就是结果。我们要注意到处理dp[i][j]时,我们需要知道 dp(i+1,j-1)的结果,所以i必须降序,j必须升序,才能保证在计算dp(... 阅读全文
posted @ 2015-07-10 16:46 雨尘之林 阅读(651) 评论(0) 推荐(0)
摘要:我们发现这个题里每一种“移动套餐”用的次数只有0,1,2,3 是有效的,4和0是一样的。所以我们开一个数组rot[10]来记录这9个套餐分别用了多少次。字典序的处理和我们的枚举顺序息息相关。我们从 000000000 到 333333333 来枚举的话,第一个符合条件的结果当然就是所有答案中字典序最... 阅读全文
posted @ 2015-07-10 16:37 雨尘之林 阅读(668) 评论(0) 推荐(0)
摘要:很简单 不用太考虑效率 虽然每次都要重新排序注意vector的使用,非常便利。还有一个技巧就是用一个have型bool数组来记录是否存在。#include #include #include using namespace std;bool have[1000] = {0};vector v; //... 阅读全文
posted @ 2015-07-10 16:31 雨尘之林 阅读(489) 评论(0) 推荐(0)
摘要:思想来自:http://blog.pureisle.net/archives/475.html主要思想是用1和0来表示是否被填,然后根据两行之间的状态关系来构建DP方程。1.首先初始化第一行 计算第一行可以被横着填的方案数。此时cnt是1 所以其实合法的dp[1][j]都是12.然后开始构建第二行至... 阅读全文
posted @ 2015-07-08 17:48 雨尘之林 阅读(442) 评论(0) 推荐(0)
摘要:#include #include #include using namespace std;struct person{ int data; int id;};int l[1001],r[1001];//存储编号为i的左边的编号和右边的编号int data[1001];//存储编号为i... 阅读全文
posted @ 2015-07-08 17:42 雨尘之林 阅读(315) 评论(0) 推荐(0)
摘要:http://acm.sjtu.edu.cn/OnlineJudge/problem/1382注意到 排序之后 i从前向后扫描时,cur恰好是从后向前的,所以即使是双重循环,也是O(n)的算法。#include #include using namespace std;int N,S;unsigne... 阅读全文
posted @ 2015-07-08 16:02 雨尘之林 阅读(341) 评论(0) 推荐(0)
摘要:枚举法就好了,推理很麻烦,感觉也做不出来。创造一个结构体,一个是真实的数,一个是花费的牙签数。构建一位数,两位数,三位数即可。#include #include using namespace std;//从0到9耗费的牙签数int cost[10]={6,2,5,5,4,5,6,3,7,6};st... 阅读全文
posted @ 2015-07-08 15:57 雨尘之林 阅读(416) 评论(0) 推荐(0)
摘要:典型的BFS,找到起点直接进行搜搜即可。要注意的就是层数的处理。坐标到id的转换。还有就是要尽早判断是否达到终点。代码注释很详细,最后面两个函数是一开始写的 用抽取邻接矩阵+Dijkstra 来算的,很麻烦 头脑一热的结果。。#include #include #include using name... 阅读全文
posted @ 2015-07-07 22:16 雨尘之林 阅读(399) 评论(0) 推荐(0)
摘要:状态压缩,当我们的状态太多时可以考虑用bit来存储,用二进制来表示集合,用&来取交集,用^来异或。DP过程很简单,遍历所有情况取最短路径就行,因为最短哈密顿回路本身就是一个NPC问题,效率不高。#include #include using namespace std;//最短哈密顿回路问题 NP完... 阅读全文
posted @ 2015-07-06 23:21 雨尘之林 阅读(462) 评论(0) 推荐(0)
摘要:虽然DLX可以提高效率....但是对于NPC问题也不用太追求效率了,而且还只有一个测试点。所以 只要DFS不断的填入,直到空格全部被填满;要注意的是DFS中全局变量的更新和恢复。至于存储的方法,只要考虑每一行每一列每一个小块的不重复即可。#include #include using namespa... 阅读全文
posted @ 2015-07-06 23:08 雨尘之林 阅读(565) 评论(0) 推荐(0)