随笔分类 - 算法学习笔记
摘要:其实巨水...然而 不用scanf prinf 根本过不了.....真无聊第一版代码有点问题 效率不高 主要是考虑到这个家族有可能一开始就是个森林 不是从树里分出去的实际上数据点还是一棵树 然后变成的森林 这样的话只要三个数组就可以了alive记录是否活着sons记录每个人的子节点个数father记...
阅读全文
摘要:字符串水题, 但是最后一步关于计算重复度的还是很好玩的地方。另外就是注意代码简洁性、可读性的练习。#include #include #include using namespace std;char getNumber(char c){ if(c=='-' or c=='Q' or c=='...
阅读全文
摘要:http://acm.sjtu.edu.cn/OnlineJudge/problem/4020一上手就来了一个删点 排序+DFS.... 虽然正确性没问题 但是超时 只有60分. 主要在于不知道怎么减少搜索量思路就是删除一些肯定不能在的点, 然后经过条件判断 DFS地去搜索最长的路径#include...
阅读全文
摘要:#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...
阅读全文
摘要:这个题只用BFS来搜索一次会很麻烦, 因为每次经过一个宝藏之后,要把所有的vis重置(因为可以重复经过同一点, 但是这样会有很多不必要的路径)看题目的暗示 最多只有5个宝藏 我们要把所有的宝藏收集齐全, 如果确定了收集的顺序, 那么也就确定了路径那么可以知道 A55的排列一共是120种路径 遍历起来...
阅读全文
摘要:...被输入给坑了 应该先把所有的空格删掉再玩 还有就是测试点里好像根本就没有关于后结合的事情...不过后结合也很简单 控制一下优先级的判断即可.中缀表达式的处理核心就是两个堆栈的维护一个是 操作符栈一个是 操作数栈只有当 当前正在处理的操作符的优先级大于(不考虑后结合时) 栈顶操作符的时候, 才进...
阅读全文
摘要:和石子合并很像, 为了对环状进行处理, 我们可以把输入数据复制一份接连在后边. 这样在最后的结果枚举起点找最大即可.注意这里代价的计算, 因为我们的data[i]只记录了珠子的头 , 珠子的尾部即是下一个珠子的头部.//因为计算dp[i][j]时需要用到dp[i][k]k比j小 所以j要顺序DP也需...
阅读全文
摘要:简单的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){ ...
阅读全文
摘要:此题倒是能用贪心骗点分...其实对于每一个位置 , 我们知道最后的改善结果一定是原数列中的数 .(因为要尽量减少消耗, 可以考虑减小至和相邻的相同) 有了这个结论之后, 我们就考虑用dp来做这件事情首先 存下所有数据于 data[]排序data 得到 data_sort[]然后用dp[i][j]来表...
阅读全文
摘要:更新...最后发现根本不用在循环中判断是否是素数, 因为先除的肯定是素数, 后面的以该素数的倍数组成的合数早就被除没了.....//新的build() 注意最后一位的处理void build(){ int sq = sqrt(ori); int i; for (i = 2;...
阅读全文
摘要:这个要把dp[i]的状态分成两类 第一类是以)结尾的, 第二类是以a结尾的.#include using namespace std;const int mod = 19301; unsigned long long dp[10000];int n;void build(){ dp[0]=1;...
阅读全文
摘要:这个DP要用状态分类下标的思想, 把dp[i]分成dp[i][0]和dp[i][1]来处理 0表示不翘课 1表示翘课, 这样可以更好的利用逻辑关系高精度就不放在这里了,只有核心代码int main(int argc, char const *argv[]){ int n; cin>>n;...
阅读全文
摘要:优先队列自动解决了动态排序问题,非常好用。。。#include #include #include #include using namespace std;int n;int seeds[10000];int presum[10000];priority_queue,greater > q;voi...
阅读全文
摘要:水题也要优化效率嘛1.用两个数组单独记录下标的更新2.用STL中lower_bound来进行二分查找.要注意lower_bound的返回值意义 是大于等于val的第一个,所以返回值要进行判断才可以利用#include #include #include #include using namespac...
阅读全文
摘要:dp[i][j][k][l]表示同时从(1,1)到(i,j)和从(1,1)到(k,l) 的 最大热心程度。(= = 三维的优化 有时间在搞。。)注意这里有个地方和别人不太一样,我是判断如果终点重复的时候,直接减去一次那个点得好心度,表示有一条经过时该位置的人的好心度是0;#include using...
阅读全文
摘要:扫雷玩得好还是有点好处的......这个题一开始像从后向前按照第一排的数字进行DFS 发现自己真傻,先不说这种情况下每个数字的填写情况很多, 还要处理相邻位置的问题。所以可以对每一位有没有地雷进行枚举。处理每一位的时候,要保证上一个数字是合理的,否则不用进行下去了,类似回溯,注意have变量的处理就...
阅读全文
摘要:一开始用了模拟的方法,DFS来搜索,但是因为当n很大的时候有很多的重复计算,因为会踏过重复的点进行重复的操作,而且不能不走这些重复的路径,因为没有存储结果,最后只过了三个点。考虑到重复的路径,所以想到利用动态规划。可以认为dp[i][j]表示的是 从左上角开始走,走出以(1,1)到(i,j)为两个端...
阅读全文
摘要:一开始想贪心,类似启发式搜索的感觉...后来觉得不行,而且很难写。不如就枚举。可以通过0到2^W的中的每一个数的二进制形式来对应,第一行每个位置是否作为中心点放入十字格子的情况。当此处为0时表示不放,1时表示放。为什么只枚举第一行的所有情况就可以了呢。因为第一行的情况确定之后,我们可以通过推理先改变...
阅读全文
摘要:Description小M有很多个机器人,他们要么一直说真话,要么一直说假话。然后每个人都说:(1). 不到N个人比我工作得多(2). 至少M个人的工资比我高。保证没有两个人的工作一样重,也没有两个人的工资一样高,问至少有多少机器人?Input Format一行两个数整数N, M (1≤N,M< 2...
阅读全文
摘要:非常简单的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]...
阅读全文

浙公网安备 33010602011771号