随笔分类 -  算法

摘要:UVa 1584 题目大意:给定一个含有n个字母的环状字符串,可从任意位置开始按顺时针读取n个字母,输出其中字典序最小的结果 解题思路:先利用模运算实现一个判定给定一个环状的串以及两个首字母位置,比较二者字典序大小的函数, 然后再用一层循环,进行n次比较,保存最小的字典序的串的首字母位置,再利用模运 阅读全文
posted @ 2016-03-24 01:32 tan90丶 阅读(473) 评论(0) 推荐(0)
摘要:FZU 1343 题目大意:手放在键盘上时,稍不注意就会往右错一位。这样Q就会输入成W,输入J就会变成K 给定一串大写敲错后输入,输出正确的输入(输入保证合法,如输入中不会出现Q,A,Z); 解题思路:将字符按键盘顺序存在一个数组中,然后找到每个字符在数组中的位置,输出它的前一个字符,若未找到则输出 阅读全文
posted @ 2016-03-23 00:39 tan90丶 阅读(174) 评论(0) 推荐(0)
摘要:POJ 1488 题目大意:给定一篇文章,将它的左引号转成 ``(1的左边),右引号转成 ''(两个 ' ) 解题思路:水题,设置一个bool变量标记是左引号还是右引号即可 /* POJ 1488 Tex Quotes 水题 */ #include <cstdio> #include <cstrin 阅读全文
posted @ 2016-03-23 00:01 tan90丶 阅读(129) 评论(0) 推荐(0)
摘要:HDU 1061 题目大意:给定数字n(1<=n<=1,000,000,000),求n^n%10的结果 解题思路:首先n可以很大,直接累积n^n再求模肯定是不可取的, 因为会超出数据范围,即使是long long也无法存储。 因此需要利用 (a*b)%c = (a%c)*(b%c)%c,一直乘下去, 阅读全文
posted @ 2016-03-22 22:33 tan90丶 阅读(249) 评论(0) 推荐(0)
摘要:POJ 1159 题目大意:给定一个长度为n的字符串,求至少添加多少个字符能使得它变成回文串 解题思路:求原串的逆串(abcdd的逆串为ddcba),然后求原串与逆串的最长公共子序列,即为c,则n-c即为最少添加的字符(不懂如何证明,只能大脑大概过明白) 求两个字符串a,b的最长公共子序列: 定义状 阅读全文
posted @ 2016-03-22 00:49 tan90丶 阅读(265) 评论(0) 推荐(0)
摘要:HDU 1159 题目大意:给定两个字符串,求他们的最长公共子序列的长度 解题思路:设字符串 a = "a0,a1,a2,a3...am-1"(长度为m), b = "b0, b1, b2, b3 ... bn-1"(长度为n), 它们的最长公共子序列为c = "c0, c1, c2, ... ck 阅读全文
posted @ 2016-03-20 22:05 tan90丶 阅读(214) 评论(0) 推荐(0)
摘要:HDU 1087 题目大意:给定一个序列,只能走比当前位置大的位置,不可回头,求能得到的和的最大值。(其实就是求最大上升(可不连续)子序列和) 解题思路:可以定义状态dp[i]表示以a[i]为结尾的上升子序列的和的最大值,那么便可以得到状态转移方程 dp[i] = max(dp[i], dp[j]+ 阅读全文
posted @ 2016-03-07 00:12 tan90丶 阅读(207) 评论(0) 推荐(0)
摘要:HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同。 /* HDU 1231 最大连续子序列 入门DP */ #include <cstdio> #include <cstring> int dp[10005]; int main 阅读全文
posted @ 2016-02-19 01:19 tan90丶 阅读(1125) 评论(0) 推荐(0)
摘要:HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义dp[i]表示以a[i]为结尾的子序列的和的最大值,因而最大连续子序列及为dp数组中的最大值。 状态转移方程: 阅读全文
posted @ 2016-02-19 01:01 tan90丶 阅读(4413) 评论(0) 推荐(2)
摘要:HDU 2717 题目大意:在x坐标上,农夫在n,牛在k。农夫每次可以移动到n-1, n+1, n*2的点。求最少到达k的步数。 思路:从起点开始,分别按x-1,x+1,2*x三个方向进行BFS,最先找到的一定是最小的步数。 /* HDU 2717 Catch That Cow BFS */ #in 阅读全文
posted @ 2016-02-07 12:17 tan90丶 阅读(202) 评论(0) 推荐(0)
摘要:POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间。不同L层的地图,相同RC坐标处是相连通的。(.可走,#为墙) 解题思路:从起点开始分别往6个方向进行BFS( 阅读全文
posted @ 2016-02-07 00:12 tan90丶 阅读(199) 评论(0) 推荐(0)
摘要:HDU 2096 /* HDU 2096 小明A+B 水题 */ #include <cstdio> int main() { #ifdef _LOCAL freopen("D:\\input.txt", "r", stdin); #endif int a, b, c, n; scanf("%d", 阅读全文
posted @ 2016-01-24 21:32 tan90丶 阅读(191) 评论(0) 推荐(0)
摘要:HDU 2095 find your present (2) 解法一:使用set 利用set,由于只有一个为奇数次,对一个数进行查询,不在集合中则插入,在集合中则删除,最后剩下的就是结果 /* HDU 2095 find your present (2) 水题 */ #include <cstdio 阅读全文
posted @ 2016-01-23 21:20 tan90丶 阅读(194) 评论(0) 推荐(0)
摘要:所谓顺序表,即线性表的顺序存储结构。下面给出的是数据结构 线性表的定义。 ADT List{ 数据对象: 线性表的数据对象的集合为{a1,a2,a3,...,an},每个元素的类型为ElemType。 数据关系: 除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每个元 阅读全文
posted @ 2015-12-29 00:09 tan90丶 阅读(937) 评论(1) 推荐(0)
摘要:HDU 2085 核反应堆 /* HDU 2085 核反应堆 简单递推 */ #include <cstdio> const int N = 35; long long a[N], b[N]; //a表示高能质点数目,b表示低能质点数目 int main() { #ifdef _LOCAL freo 阅读全文
posted @ 2015-12-28 03:23 tan90丶 阅读(182) 评论(0) 推荐(0)
摘要:HDU 2083 简易版之最短距离 /* HDU 2083 简易版之最短距离 */ #include <cstdio> #include <algorithm> using namespace std; const int maxn = 505; int a[maxn]; int main() { 阅读全文
posted @ 2015-12-28 03:11 tan90丶 阅读(273) 评论(0) 推荐(0)
摘要:HDU 2084 数塔 从下往上递推,状态转移方程 dp[i][j] = max( dp[i+1][j], dp[i+1][j+1]) + a[i][j]; /* HDU 2084 数塔 入门DP */ #include <cstdio> const int N = 105; int dp[N][N 阅读全文
posted @ 2015-12-27 04:55 tan90丶 阅读(205) 评论(0) 推荐(0)
摘要:HDU 2082 找单词 起码通过这题,知道了母函数是什么东西,值得一做。 /* HDU 2082 找单词 母函数 */ #include <cstdio> #include <cstring> const int N = 50; int num[30], c1[N + 10], c2[N + 10 阅读全文
posted @ 2015-12-27 03:45 tan90丶 阅读(207) 评论(0) 推荐(0)
摘要:1.素数线性筛核心 结论:每一个数都用它的最大素因子将这个合数筛掉。 (27用9筛 15用5筛) 理解:合数一定有因子,既然是几个数,就一定有最大的一个。最大因子是唯一的,所以合数只会被它自己唯一的最大因子筛掉一次。 2.如何通过一个数筛去以该数为最大因子的合数 结论1:设a是b的最大因子,则b必然 阅读全文
posted @ 2015-12-24 22:33 tan90丶 阅读(236) 评论(0) 推荐(0)
摘要:HDU 2081 手机短号 /* HDU 2081 手机短号 */ #include <cstdio> int main() { int n; char a[15]; scanf("%d", &n); while (n--){ scanf("%s", a); printf("6%s\n", a + 阅读全文
posted @ 2015-12-24 21:52 tan90丶 阅读(183) 评论(0) 推荐(0)