分类: [算法基础]

常用类之

C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值。    一、map的说明    1   头文件   #include   <map>     2   定义   map<string,   int>   my_Map;   或者是typedef     map<string,   int>   MY_MAP; &nbs ......

常用类之

  vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>构造函数。  Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的 ......

常用类之

要想使用标准C++中string类,必须要包含 #include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件 using  std::string; using  std::wstring; 或 using namespace std; 下面你就可以使用string/wstring了,它们两分别对应着char和wchar_t。 string和wstring的用法是一样的,以下只用string作介绍: string类的构造函数: string(const char *s);    //用c字符串s初始化string(int n,char c);     //用n个字符c初始化此外,string类还支持默 ......

滚动数组

dp中经常卡内存,而利用滚动数组可以大大节省内存空间。
滚动数组的作用在于优化空间,主要应用在递推或动态规划中。因为DP题目是一个自底向上的扩展过程,我们常常需要用到的是连续的解,前面的解往往可以舍去。所以用滚动数组优化是很有效的。利用滚动数组的话在N很大的情况下可以达到压缩存储的作用。

一个简单的例子:
斐波那契数列:
一般代码:

#include
#include
using namespace std;
int Fib[25];

int fib(int n)
{
	Fib[0] = 0;
	Fib[1] = 1;
	Fib[2] = 1;
	for(int i = 3; i <= n; ++i)
		Fib[i] = Fib[i - 1] + Fib[i - 2];
	return Fib[n];
}

int main()
{
	int ncase, n, ans;
	scanf("%d", &ncase);
	while(ncase--)
	{
		scanf("%d", &n);
		ans = fib(n);
		printf("%dn", ans);
	}
	return 0;
}

利用滚动数组优化后代码为:

 
#include
using namespace std;
int Fib[3];

int fib(int n)
{
	Fib[1] = 0; 
	Fib[2] = 1;
	for(int i = 2; i <= n; ++i)
	{
		Fib[0] = Fib[1]; 
		Fib[1] = Fib[2];
		Fib[2] = Fib[0] + Fib[1];
	}
	return Fib[2];
}

int main()
{
	int ncase, n, ans;
	scanf("%d", &ncase);
	while(ncase--)
	{
		scanf("%d", &n);
		ans = fib(n);
		printf("%dn", ans);
	}
	return 0;
}        

注意上面的运算,我们只留了最近的3个解,数组好象在“滚动‿一样,所以叫滚动数组。
滚动数组实际是一种节约空间的办法,时间上没什么优势,多用于DP中,举个例子先:
一个DP,平常如果需要1000×1000的空间,其实根据DP的特点,能以2×1000的空间解决问题,并且通过滚动,获得和1000×1000一样的效果。

筛法求素数

素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功。 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 。。N^(0.5) ,看看能否整除N。 如果需要判断的次数较多,则用下面介绍的办法预处理。 void make_prime() { memset(prime, 1, sizeof(prime)); prime[0]=false; prime[1]=false; int N=31700; for (int i=2; i<N; i++) if (prime[i]) { primes[++cnt ]=i; for (int k=i*i; k<N; k+=i) prime[k]=false; ......

欧几里德算法(求最大公约数)

欧几里德算法也就是辗转相除法,有着2000年的历史了。欧几里德算法依据的算法理论是一个定理:gcd(a,b) = gcd(b,a mod b)。
实现源码为:

//递归实现
int gcd(int m, int n)
{
	if (m < n)
	{
		int tem = m;
		m = n;
		n = tem;
	}
	if (n == 0)
		return m;
	else
		return gcd(m, m%n);
}

//非递归实现
int gcd(int m, int n)
{
	if (m < n)
	{
		int tmp = m;
		m = n;
		n = tmp;
	}
	if (n == 0)
		return m;
	while (n > 0)
	{
		int tmp = m % n;
		m = n;
		n = tmp;
	}
	return m;
}

  1. 1 逆光 孙燕姿
  2. 2 你给我听好 陈奕迅
  3. 3 怎样 戴佩妮
  4. 4 有没有 薛之谦
  5. 5 一个人 韩红
  6. 6 我要快乐 张惠妹
  7. 7 我不难过 孙燕姿
  8. 8 外面的世界 莫文蔚
  9. 9 只剩一分钟 金玟岐
  10. 10 心火 姚贝娜
  11. 11 无底洞 蔡健雅
  12. 12 舍得 王呈章
  13. 13 秘密 蓝又时
  14. 14 学不会 林俊杰
  15. 15 词不达意 林忆莲
  16. 16 可以了 陈奕迅
  17. 17 天空 蔡依林
  18. 18 一个人的冬天 陈楚生
  19. 19 椿 沈以诚
  20. 20 走不出的回忆 任然
  21. 21 谢谢你再见 吉克隽逸
  22. 22 会过去的 梁静茹
  23. 23 青春住了谁 杨丞琳
  24. 24 解脱 李玖哲
  25. 25 梦话 A-Lin
  26. 26 刘惜君
  27. 27 那年 任然
  28. 28 爱过 戴佩妮
  29. 29 真实 张惠妹
  30. 30 失眠的黑夜 吉克隽逸
  31. 31 情话 余佳运
  32. 32 一叶知秋 陈楚生
  33. 33 仰望 杨丞琳
  34. 34 独角戏 许茹芸
  35. 35 保留 黄义达
  36. 36 瞬间 陈一玲
  37. 37 该忘了 郭采洁
  38. 38 远在眼前的你 王心凌
  39. 39 好好过 金池
  40. 40 爱情 万岁爺
  41. 41 木头的心 左颜
  42. 42 离场 李佳薇
  43. 43 没有人不比我快乐 Fine乐团
  44. 44 失落沙洲 徐佳莹
  45. 45 你在,不在 郭采洁
  46. 46 死结 李玖哲
  47. 47 淘汰 陈奕迅
  48. 48 落俗 李荣浩
  49. 49 其实 薛之谦
  50. 50 自我催眠 罗志祥
  51. 51 就这样 李荣浩
  52. 52 我害怕 薛之谦
  53. 53 歌路 刘瑞琦
  54. 54 飞走了 金海心
  55. 55 关键词 林俊杰
  56. 56 底细 杨宗纬
  57. 57 我以为 徐薇
  58. 58 坠落 蔡健雅
  59. 59 陌生人 蔡健雅
  60. 60 败将 陈势安
  61. 61 飘着 孙燕姿
  62. 62 妥协 蔡依林
  63. 63 岁月神偷 金玟岐
  64. 64 记念 萧敬腾
  65. 65 逞强 萧亚轩
  66. 66 需要人陪 王力宏
  67. 67 会痛的石头 萧敬腾
  68. 68 孤独是会上瘾的 吴克群
  69. 69 隐形纪念 蔡淳佳
  70. 70 停了的钟 萧煌奇
  71. 71 终于 张韶涵
  72. 72 懂得自己 杨丞琳
  73. 73 这一路走来 杨宗纬
  74. 74 过我的生活 萧煌奇