
算法
文章平均质量分 74
jsongo
做最正确的事
展开
-
一个ACM题的求解过程
题目: Problem A.Ant on a Chessboard(10161) Background One day, an ant called Alice came to an M*M chessboard. She wanted to go around all the grids. So she began to walk alo原创 2010-04-10 13:32:00 · 609 阅读 · 0 评论 -
大数求余
<br />输入一些数,判断是否可以被 17整除。是就输入1,否则输入0.<br />#include<stdio.h>#include<string.h>int main() { char s[200]; while(scanf("%s", &s) == 1) { if(!strcmp(s, "0")) break; int m = 0; for(int i = 0; i < strlen(s); i++) m = (m*10+s[i]-'0原创 2011-04-10 14:29:00 · 1496 阅读 · 0 评论 -
求数组连续最大和问题
<br />给定一个数组,求解其中连续的最大的子数组<br />如:1 -1 2 2 3 -3 4 -4 5 -5,最大的连续子数组是:2 2 3 -3 4 -4 5,当然前面的1和-1可要,可不要,得到的结果是9<br />用程序怎么实现呢,其实这是简单的动态规划题型:<br />#include<iostream>using namespace std;#define MAX(x,y) x>y?x:yint main(){ int arr[] = {-100,50,23,34,原创 2011-04-09 16:31:00 · 1476 阅读 · 0 评论 -
百练4019:黑色星期五 简单题
<br /> 4019:黑色星期五查看提交统计提问时间限制: 1000ms 内存限制: 65536kB描述若某个月13号恰好是星期五,则这一天被称为黑色星期五。已知某年的一月一日是星期w,并且这一年是闰年,<br />求出这一年所有13号那天是星期5的月份,按从小到大的顺序输出月份数字。(w=1..7)输入输入有多组,每组一行且为一个整数w, 指该年的一月一日是星期w。(1<=w<=7)输出每组数据输出一行,从小到大输出具有黑色星期五的月份,月份与月份之间用空格隔开。若没有月份具有黑色星期五,则输出NULL原创 2011-04-03 01:46:00 · 1184 阅读 · 0 评论 -
百练 4021:最大乘积 枚举
<br /> 4021:最大乘积查看提交统计提问时间限制: 1000ms 内存限制: 65536kB描述给定一个整数数组,我们希望去掉其中一个数,使得剩下所有数的乘积最大,问应该去掉哪一个数输入第一行M,表示有M组数据<br />接下来2*M行,每两行表示一组测试数据,每组的第一行市一个整数N,表示是数组的长度,接下来一行有N个整数,表示数组的内容,3<=N<=100,且数组内每个数都在[-10000000,10000000]区间内.输出M行,每行一个整数,表示应该去掉的那个数,如果有多个选择,则输出最先输原创 2011-04-03 01:21:00 · 1355 阅读 · 0 评论 -
百练4022:买房子 简单题
<br /> 4022:买房子时间限制: 1000ms 内存限制: 65536kB描述某程序员开始工作,年薪N万,他希望在中关村公馆买一套60平米的房子,现在价格是200万,假设房子价格以每年百分之K增长,并且该程序员未来年薪不变,且不吃不喝,不用交税,每年所得N万全都积攒起来,问第几年能够买下这套房子(第一年房价200万,收入N万)输入有多行,每行两个整数N(10<=N<=50), K(1<=K<=20)输出针对每组数据,如果在第20年或者之前就能买下这套房子,则输出一个整数M,表示最早需要在第M年能买下原创 2011-04-03 01:19:00 · 3581 阅读 · 0 评论 -
POJ1163-动态规划
The TriangleTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 23971 Accepted: 13970Description73 88 1 02 7 4 44 5 2 6 5(Figure 1)Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers pas转载 2011-03-31 17:37:00 · 649 阅读 · 0 评论 -
完全背包问题
看这篇日志之前,请先阅读我的上一篇日志,关于0/1背包的问题。完全背包问题的描述:有N 种物品和一个容量为V 的背包,每种物品都有无限件可用。第i 种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。可能大家已经看出来了,完全背包问题其实就是在0/1背包的问题的基础上加了一个条件:每种物品都有无限件可用。这个问题有不少解法,下面只给出最优化的O(VN)的算法。这个算法使用一维数组,先看伪代码:for i=1..Nfor v=0..Vf[v]=m原创 2010-08-03 16:55:00 · 598 阅读 · 0 评论 -
0/1背包问题 详解
动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些结果减轻运算量。比如01背包问题。/* 一个旅行者有一个最多能用M公斤的背包,现在有N件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为P1,P2,...,Pn.若每种物品只有一件求旅行者能获得最大总价值。输入格式:M,NW1,P1W2,P2......输出格式: X */因为背包最大容量M未知。所以,我们的程序要从1到M一个一个的试。比如,开始任选N件物品的一个。看对应M的背包,能不能放进去,如果能放进去,原创 2010-08-03 16:53:00 · 644 阅读 · 0 评论 -
Floyd算法
本文只谈用Floyd算法来求 图中各点的最小或第k短路径。 设opt[i][j][k]表示从i到j的路径中,经过的点的编号不超过k的最短路。边界条件opt[i][j][0] = dis[i][j] 转移方程:opt[i][j][k] = Min(opt[i][j][k-1] , opt[i][k][k-1] + opt[k][j][k-1]) (k > 0 , 0 则opt[i][j][n]即为所求值。一般的算法:for(k=0;k for(i=0;i for(j=0;j原创 2010-06-03 21:59:00 · 698 阅读 · 0 评论 -
最长上升子序列问题的几种解法
拿POJ 2533来说。Sample Input71 7 3 5 9 4 8Sample Output4从输入的序列中找出最长的上升子序列(LIS)。这题一看,是一道典型的DP问题(就是动态规划),可以用dfs,深度优先遍历来解,如下代码:#include#includeusing namespace std;int n;int* a;stack s;int count=0;int best=0;void dfs(int i){ if(i==n) { if(s.size()>best) best=原创 2010-07-29 01:15:00 · 796 阅读 · 0 评论 -
图的建立 与 DFS、BFS
这一个程序写了好久,主要是对三个结构体同时操作时出现混乱。其中,我把每个节点从a到z分别命名。这程序的输入是一个矩阵,如下:0 11 011 0 130 13 0由这个矩阵的对称性可以看出,它是一个无向图,当然本程序也可以处理有向图。程序里,我是用邻接法来建立图的。有兴趣的朋友可以试试用 十字链表 来实现有向图,用 邻接多重表 来实现无向图。但原创 2010-05-17 21:20:00 · 955 阅读 · 2 评论 -
递归计算向非递归计算转换模板
转自:http://mysougou.javaeye.com/blog/570046 理论上而言,所有递归程序都可以用非递归程序来实现;这种理论的基础是递归程序的计算总能用一颗树型结构来表示。递归计算从求树根节点的值开始,树根节点的值依赖一个或多个子节点的值,子节点的值又依赖下一级子节点的值,如此直至树的叶子节点。叶子节点的值能直接计算出来,也就是递归程序的出口。如下图所示,是递归函转载 2010-05-08 17:41:00 · 869 阅读 · 0 评论 -
汉诺塔与二叉树
我相信很多朋友都知道汉诺塔问题,也有不少看过了它的程序实现,但我想有不少人不懂它是什么意思,为什么那几行程序就把汉诺塔问题给解了呢? 先啰嗦一会儿。解释一下。。。看看汉诺塔的由来 (从百度百科中摘来的)汉诺塔是源自印度神话里的玩具。 上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆原创 2010-05-08 17:38:00 · 3306 阅读 · 1 评论 -
哈弗曼树的创建及哈弗曼编码
今天晚上花了好几个小时写了这个程序。。。都怪我效率太低。。。好了废话不多说,下面就给出我的代码。(这个代码参考了 严蔚敏老师 的算法)其中具体的实现就不多讲,因为我在注释都写了。 #includeusing namespace std;struct hTNode{ unsigned int weight; unsigned int parent,lchild,rchild;原创 2010-05-04 23:14:00 · 1221 阅读 · 0 评论 -
二叉树的建立和遍历
这个二叉树的建立过程中,要求手动输入一个一个的数据,不过你可以选择输入或不输入左右子树。至于遍历的方法也就是那基本的三种:先序遍历,中序遍历,后序遍历(还有一种线索遍历比较复杂,这里不给出);#includeusing namespace std;typedef int DATATYPE;//定义 一个树结点的结构体struct treeNode{ DATATYPE data;原创 2010-04-10 10:05:00 · 1035 阅读 · 0 评论 -
四则运算式的程序解析(C++版)
刚花了一个小时左右的时间写了这个程序,用它可以计算任意长度的任意复杂度的四则运算式(当然这是在硬件条件的支持限度内)#include#includeusing namespace std;//用来判断读入的一个字符是否是数字bool isData(char ch){ if(ch>47&&ch<58) return true; return false;}//用来判断是否是原创 2010-04-09 21:14:00 · 3350 阅读 · 5 评论