上一页 1 ··· 23 24 25 26 27 28 29 30 31 ··· 43 下一页
摘要: http://wikioi.com/problem/1220/最基本经典的DP题目,唯一有点意思的是,自底向上计算会更简洁。另外对这种+方式累计的DP,可以直接把原来的存进去,然后再加,本质是不用在同一步更新,因为没有更复杂的运算,只是叠加而已。#include int dp[101][101];int Max(int x, int y){ return x > y ? x : y;}int main(){ int n; scanf("%d", &n); for (int i = 1; i = 2; i--) { for (int j = 1; j ... 阅读全文
posted @ 2013-10-01 23:29 阿牧遥 阅读(196) 评论(0) 推荐(0)
摘要: 因为搜索所有答案,所有我有了个DFS的方案。但后来一看,超时又错误,因为看错题,求的是所有最短路径的解。public class Solution { private ArrayList> ans = new ArrayList>(); private HashSet visited = new HashSet(); HashSet dict = null; private String start = null; private String end = null; public ArrayList> findLadders(String start, String end 阅读全文
posted @ 2013-10-01 20:20 阿牧遥 阅读(605) 评论(0) 推荐(0)
摘要: 这道题的代码没啥好说的,用了O(n)的空间就是水题了。但可以讲一下思考过程。一开始是想O(1)的空间的,然后想从左往右双指针扫,然后根据出现顺序交换遇到的偶数和奇数。但遇到一个问题:1, 2, 3, 4, 5; 第一次交换完是 1, 3, 2, 4, 5;但再往右扫就会再次碰到2这个偶数,又会和5交换,成为1, 3, 5, 4, 2, 错误!试了一下别的交换方法,也不行。想了想,觉得当出现这种奇数偶数交替出现的情况,单靠这样交换是不行的,因为第一个偶数要出现在所有奇数完了之后的位置。想了另一个角度,一个指针在最左,一个指针在最右。然后两边往中间扫,但这道题又要保持原序,又不行。最后看了别人的做 阅读全文
posted @ 2013-10-01 18:04 阿牧遥 阅读(362) 评论(0) 推荐(0)
摘要: 这道题是DP。那么一开始很自然的想出了O(n^3)的方法。就是预处理是否是Palindrome的boolean[][],话费O(n^3)。然后处理i到j段件的cut数目int[][]也花O(n^3)时间,因为i和j两层循环,中间又要遍历一次i和j之间的分割点。但是网上看了一下两者都可以化简到O(n^2)。前者也是个DP,因为valid[i][j]依赖于valid[i+1][j-1]和s[i]==s[j]。而后面其实多求了许多不需要的信息,我们只要cut[0][j]就行了,而这里把所有的cut[i][j]都求了。这有点像Floyd算法求了所有点之间最短距离,所以复杂度就比Dijkstra高了一维 阅读全文
posted @ 2013-09-30 22:15 阿牧遥 阅读(172) 评论(0) 推荐(0)
摘要: http://wikioi.com/problem/1169/棋盘型的动态规划,这道题可以看成是从左上角向右下角走两条不重合的路(除了开始和结尾)。动态规划要想的是状态和阶段,状态是(x1,y1,x2,y2),两个分别一步一步走,所以阶段就是L=x+y。这样状态也能简化成三维(L, x1, x2)。约束是其中每一部两个棋子不能重合(如果重合就设为0)。状态转移是每一步都可以从之前的四个状态走过来,比较取最大值就行。如果用循环的方式写,则L从小到大,x1,x2也从小到大循环。这里用了备忘录方式写,就比较方便。#include #include #include using namespace s 阅读全文
posted @ 2013-09-30 21:00 阿牧遥 阅读(210) 评论(0) 推荐(0)
摘要: 思路,思路,还是思路。拿到这道题目的时候,习惯性的用DP去想,想不出,然后想分治,然后想到搜索(遍历),觉得效率太低。但其实看了题解之后,这种求全部解的,用遍历如DFS是很自然的。相比之下,之后的Palindrome PartitioningII那个题目,DP显然更自然。当理解到是DFS时,这道题忽... 阅读全文
posted @ 2013-09-30 13:51 阿牧遥 阅读(233) 评论(0) 推荐(0)
摘要: 这道题有点难。(首先这题是重新创建一个新的BST,所以就不用去想怎么在原有的list里面指针颠来倒去了。)1.首先这道题如果O(n*logn)就很简单了。如果可以O(n)空间的话,转化成数组,就可以O(n)时间,但这就没意思了。所以答案是可以O(1)空间,O(n)时间的。2.看过答案知道是自底向上考虑。但试了一下,生成的子树的节点个数先是少的,然后变多,然后又少(一开始1个节点的左子树,然后生成3个节点的子树时,又要生成1个节点的右子树),用循环写很不好表示状态,需要用栈来记住很多东西。3.那么看到很多相似的步骤,就可以用递归来做,但这是个自底向上的递归,怎么做呢?看一下答案,发现有这么些规律 阅读全文
posted @ 2013-09-30 01:47 阿牧遥 阅读(408) 评论(0) 推荐(0)
摘要: http://community.topcoder.com/stat?c=problem_statement&pm=10750&rd=14153http://apps.topcoder.com/wiki/display/tc/SRM+470因为是棋盘型,然后就想到棋盘型DP;觉得不行,就想到BFS/DFS(这时其实已经把这个看成一张图了)。发现,寻找下一个节点进来的时候,总是要全局考虑所有已经Activate的点,BFS/DFS未果。此时感觉有点像最小生成树的Prim算法,用贪心的,但不知如何证明。此时看了一下题解,发现果然可以规约成最小生成树。因为本质是把棋盘看成一棵树后,整 阅读全文
posted @ 2013-09-28 12:00 阿牧遥 阅读(334) 评论(0) 推荐(0)
摘要: http://community.topcoder.com/stat?c=problem_statement&pm=11225&rd=14427http://apps.topcoder.com/wiki/display/tc/SRM+498此题的暴力解法是一个BFS。BFS的话,要有Queue,如果是图的话,还要有Set来记录走过的状态。后面答案中会看到其实可以用贪心,就是只要输入和输出的各种颜色数量一样,就一定能变换过来,这个下回再表。import java.util.*;public class NinePuzzle{ public int getMinimumCost(S 阅读全文
posted @ 2013-09-28 02:37 阿牧遥 阅读(312) 评论(0) 推荐(0)
摘要: http://community.topcoder.com/stat?c=problem_statement&pm=10172&rd=13515http://community.topcoder.com/tc?module=Static&d1=match_editorials&d2=srm424这道题目是和最小生成树有关。记得最小生成树的一个算法(容易实现的那个),Kruskal,要用到并查集。想想就是以边为主,那么才可能形成多个边的集合,然后再合并。并查集的n次合并查找的复杂度是o(n)。TopCoder的思想似乎主要是快速实现解决问题,对复杂度的要求一般,所 阅读全文
posted @ 2013-09-26 23:15 阿牧遥 阅读(229) 评论(0) 推荐(0)
上一页 1 ··· 23 24 25 26 27 28 29 30 31 ··· 43 下一页