算法精解
文章平均质量分 50
专为解释算法原理, 解答算法题目而开的专栏!
Yihui_He
Deep Learning, Computer Vision, AI, Computer Network
展开
-
[动态规划] 放置街灯 Uva 10859 - Placing Lampposts
我的思路是: 先将每个灯周围的路存储 为 1 其他 路为 0 . 再算出任意几个灯点亮之后的补集, 被重复点亮的路记为2, 只点亮一次的记为1, 没有点亮的是0. 优化公式x=M*a+b, a为 未点亮的灯的个数, b为 标记为2 的路的个数 M为略微大于路总数的一个常数. 之后遍历所有子集即可. 代码与我上一篇文章类似.原创 2015-03-04 09:23:42 · 753 阅读 · 0 评论 -
[动态规划] 黑客的攻击 Hacker's CrackDown Uva 11825
抽象为数学模型就是, 取尽可能多的互不相交的子集 , 使得每一个子集都能覆盖全集 #include #include #include using namespace std; int n; int P[1000],cover[1000],f[1000]; int main(){ scanf("%d", &n); for (int i = 0; i < n;i+原创 2015-03-03 22:19:24 · 1156 阅读 · 0 评论 -
[动态规划] Sum游戏 ( Game of Sum, Uva 10891 )
抓住状态转移方程即可 : 从子序列 i j 中取最大 = i + 从子序列i+1,j中取最大 或 j + 从子序列i,j-1中取最大 #include #include #include using namespace std; const int maxn = 100+10; int S[maxn], A[maxn], d[max原创 2015-03-02 21:11:39 · 1000 阅读 · 0 评论 -
Even Parity Uva 11464 ,
写的时候多打了个叹号... 坑了很久 #include #include #include using namespace std; int main(){ int answer = 0; int n; scanf("%d", &n); int mat[17][17]; int vis[17][17]; memset(vis, 0,原创 2015-01-29 01:06:58 · 650 阅读 · 0 评论 -
正整数排序 Help is need for Dexter Uva 11384
面对刚开始没有头绪的题目, 先进行尝试往往是非常有必要的, #include #include using namespace std; unsigned int cal(unsigned int n){ if (n == 1) return 0; else if (n == 2) return 1; else return cal((unsigned int)(n/2原创 2015-01-30 21:07:53 · 932 阅读 · 0 评论 -
网络 network,Seoul 2007 LA3902 解题感想
一道关于 DFS 的题目, 关键在于距离 K, 将服务器的节点作为根节点进行DFS #include #include #include using namespace std; const int maxn = 1000 + 10; vector tree[maxn], nodes[maxn]; int fa[maxn]; int s, k, n; bool covered[ma原创 2015-02-01 17:06:38 · 945 阅读 · 0 评论 -
长城守卫 Beijing guards CERC 2004 LA3177 解题总结
在最小值,最大值的问题 或者没有办法确定答案时候, 可以使用二分答案法. #include #include #include using namespace std; int main(){ fstream f("E:\\text.txt"); int n; int gift[100]; bool used[100]; memset(used, 0, sizeof(use原创 2015-02-01 18:38:23 · 1548 阅读 · 0 评论 -
( 设计高效算法 ) 年龄排序 Age Sort Uva 11462
可以使用整数排序法, 内存太小无法堆排序. #include #include using namespace std; int main(){ unsigned int age[101]; int n,temp; while (scanf("%d", &n) == 1 && n){ memset(age, 0, sizeof(age)); for (int i = 0;原创 2015-02-01 20:58:23 · 697 阅读 · 0 评论 -
[高效算法设计]Calculator conundrum Uva 11549
使用 sstream 方便输入输出, 用于判断某个元素是否被访问过, 在数组开不下的时候可以使用 set集合 #include #include #include using namespace std; int next(int n, int k){ stringstream ss; ss << (long long)k*k; string s = ss.str()原创 2015-02-01 23:07:31 · 548 阅读 · 0 评论 -
(高效算法设计)之高维问题 废料堆 Garbage heap Uva 10755
#include #include #define FOR(i,s,p) for(int i=(s);i<=(p);i++) using namespace std; void expand(char i, bool b[]){ b[0] = i & 1; i >>= 1; b[1] = i & 1; i >>= 1; b[2] = i & 1; } // 这里使用了二项式中的思想,原创 2015-02-07 15:13:46 · 895 阅读 · 1 评论 -
动态规划 最长公共子序列 王子和公主 Prince and Princess UVa 10635
#include #include using namespace std; const int maxn = 250 * 250; int main(){ char T; cin >> T; for (char k = 0; k < T;k++) { int n, p, q; cin >> n >> p >> q; int num[maxn]; memset(n原创 2015-02-09 00:14:12 · 1467 阅读 · 0 评论