摘要:
题目地址;http://acm.uestc.edu.cn/problem.php?pid=1696&cid=167状态定义:dp[i][j]表示第 i 天,手持 j 股时最多能赚多少钱。状态转移:第i天交易的状态只能由[0, i-w-1]天的状态转移过来!!!处理方法:构造a[]数组,a[j]表示第[0, i-w-1]天中,手持j股的最大收益,在转移第w+1天到最后一天时,每转移完一天后,更新a[]数组。第i天的状态dp[i][j]的转移根据a[]数组来,而不是dp[i-1][](其实你会发现第i天时,a[j]就是dp[i-w-1][j])。优化:单调队列。详细细节见代码的注释哟!#i 阅读全文
2012年6月15日
摘要:
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1693&cid=167 dp[i][j]表示前i点加入j个好人收到的最小代价。 dp[i][j] = min( 第i点不加入好人的代价, 第i点加个好人的代价 ); 其中 第i点不加好人的代价 t1 = dp[i-1][j] + ((i-j)==1 && i%10==0)?1:0; 第i点加好人的代价 t2 = dp[i-1][j-1] + i%10==0?1:0;转移时注意某种转移能否进行哟~然后在选择最小的之后,记录是由i-1个位子哪个j转移来的。最后从后往前找直接可以得解。 阅读全文
摘要:
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1689&cid=167 按位dp+二分。 先按位dp出一个数组:dp[loc][k][k1][k2]; 表示有loc位,最高位为k,低位全为0的数M,区间[0,M]内含有k1个6,k2个8的数字的个数。比如dp[10][3][2][4]表示区间[0,3000000000]内,有2个6,4个8的数的个数。 求[0,L]内的有k1个6,k2个8的数的个数可以利用dp矩阵组合求解。 先求出[0,L-1]内有X个6和Y个8的数的个数n1,[0,R]内有X个6和Y个8的数的个数n2,于是要求的数num是满 阅读全文
2012年5月18日
摘要:
这题要用到A*。每个状态N记录个f(N)值,等于从初始状态走到该状态的实际花费g(N)+从该状态到目标状态花费的估计值h(N)。h(N)要小于等于从该状态到目标状态的实际花费。h(N):棋盘上剩余点到出口的曼哈顿距离之和。 在BFS时,优先考虑f(N)值小的,在f(N)相同时,考虑当前花费g(N)小的。为了每次找到f(N)最小的点,可以用堆(STL中的优先队列)来保存状态。 状态表示:最多四个棋子,坐标最大是n(n<=6),所以可以用一个整数来表示,相当于n进制数。 BFS时的状态扩展就很简单了,每个棋子都可向四个方向走一步,判断走的位子是否在棋盘内,是否是空的,是否和其他棋子相邻。每次 阅读全文
2012年5月12日
摘要:
这道题我用的并查集做的。首先对数据做离散化。按给出的顺序依次处理每次问答。并查集每个节点维护三个值: root:该点的根节点(从根节点到该节点的整个区间的奇偶性已经确定); sign:该节点是否是某个奇偶性确定区间的右端点; eo:该集合的根节点到该点的区间的奇偶性;结束:在遇到某区间的奇偶性出现矛盾时结束(后来得到的奇偶性和之前确定的奇偶性不同)。每次先找到a-1和b的根节点;如果a-1没有根节点:『 如果b没有根节点:b的root设为a,更新b的sign,eo; 如果b的根节点就是a,考察a到b区间是否出现矛盾; 否则得到两个区间[fb,a-... 阅读全文
2012年4月6日
摘要:
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1633 AC自动机+BFS AC自动机,参见:http://www.cnblogs.com/luna-lovegood/archive/2012/04/06/2434340.html 先用给出的模式串构造AC automaton,再进行BFS即可。代码://zzy2012.3.28AC#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<cmath> 阅读全文
摘要:
一.Trie trie是一种查找树,节点每条连向儿子的边表示一个字母,根据单词的字母排列,就能从根节点选择一条路径到达一个节点。不同单词到达不同的节点,每个节点也对应了一个单词。 详细介绍,请看:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=usingTries二.状态机 用节点代表状态,有向边代表状态转移,就构成了状态机。三.AC自动机 AC自动机是在一个trie上构造的有限状态机。 详细介绍,请见:http://www.cs.uku.fi/~kilpelai/BSA05/lectures/sli 阅读全文
2012年3月23日
摘要:
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1425 题目分析:题目中给出N个数的一个序列S={S1,S2,...,SN}。又在这个序列上定义了两种操作: 1.add将区间[L,R]内的数全部加上x; 2.query询问在区间[L,R]内,最大的上升子序列(CIS)的长度。 这里LCIS是一段连续的序列,不同于LIS,后者可以跳过一些数。 解题思路: 对区间的操作,自然想到线段树。 我们在线段树seg[4*N+100]的节点中保存7个域:L、R、Llen、Rlen、MaxLen、add、len。我们稍后看看如何对这... 阅读全文
2011年12月21日
摘要:
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1615 题目分析:作者定义了一个序列Sayainfiniteseries(简称Saries),我们用A(n)表示。A(n)由两个正整数C和d唯一确定。而定义方法则是一个递推关系,根据nmod4的余数决定A(k)和A(k-1)的关系:nmod4==1:A(k-1)+d-->A(k)nmod4==2:A(k-1)*d-->A(k)nmod4==3:A(k-1)-d-->A(k)nmod4==0:A(k-1)/d-->A(k)我们现在分析下这个序列。假定我们选定了C和d,那么可以写出这 阅读全文
摘要:
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1616 题目分析:两个字符串a,b,其中b仅由大写英文字母构成,a除了有大写英文字母,还有‘*’,‘?’;判断a能否是b的子串。其中:‘*’:表示此处有若干个待辨识的字符(可以是0个!);‘?’:表示此处恰有一个待辨识的字符。 解题思路:这个问题中包含着相同结构的子问题:若a[i]及之前的子串已经和b[k]及之前的子串匹配上了,并且a[i+1]是‘*’,那么如果以a[i+1]和b[k+1]开始的子串匹配上,整个串就匹配上了!详见代码注释。。。。。。 源代码:#include<cstdio># 阅读全文
摘要:
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1622 题目分析:求一个排列的逆序对(如果你不知道逆序对,百度就行了),用相同元素构造一个新的排列,逆序对要相同,字典需要最小。 解题思路:这道题就是求原先的排列的逆序对,求逆序对可以用树状数组做,再构造出新的排列。构造方法可以这样:n个数最大的逆序对是(n-1)×n/2,那么可以求出最后K(k:1ton)个元素全部反序,分别能得到多少逆序对。从前往后,当后k个元素全部反序的逆序对小于原序列的逆序对时(设差值为step),就把从第k+step-2个元素到第k-1元素从后往前依次往后挪一个,第k 阅读全文
摘要:
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1621 题目分析:一个二维字符数组(作者好像说acoderectangle),含有如下字符: 作者定义了一种好怪的执行代码的方式: 1.从左上点开始,最开始往右走; 2.如果碰到'v','>','<','^'就改变走的方向; 3.碰到'@'就结束; 4.碰到大写英文字母就输出来; 5.如果出现循环就停止,并在输出时,把循环的内容用[]框上; 6.走出界就结束。解题思路:其实这题还是蛮简单的模拟题。下面简要的列些要 阅读全文
摘要:
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1620 题目分析:在1~N的位子种了N个黄瓜,每个黄瓜有个level值:0~9(我们把0看成level值好了,有影响吗?)。作者要在某点k以R为范围探查黄瓜,就是说作者想知道在区间[k-R,k+R]内所有黄瓜中最高的level值是多少(如果k-R<1或k+R>N怎么办呢?这样边界就是1或N了呗)。问题抽象出来就是求区间最大值的问题! 解题思路:求区间最大值,推荐使用线段树。程序先完成对线段树的初始化:seg[i]=0,foralli;再构造线段树了(详见代码中的cre函数);对每个k点求出范 阅读全文
摘要:
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1618 题目分析:SaSet定义为平方数的有序集合:{0,1,4,9,...,n*n}。在这个集合上定义了5种运算: 1.a+0=a; 2.a-0=a; 3.a+1:按序排列的平方数中,排在a后面一个的那个; 4.a-1:按序排列的平方数中,排在a前面一位的那个; 5.a+b:这种运算被分解为两个基本运算:(a+1)+(b-1)。 Input会包含多组a,b,计算每组a+b的结果并输出。 解题思路:既然SaSet是平方数的有序集合,那就用一个数组set[400]来... 阅读全文