打表是一种典型的用空间换时间的技巧,通常指将全部可能须要用到的结果事先计算出来,这样后面须要用到时就能够直接查表得到。打表常见的用法有以下几种:ios
一、在程序中一次性计算出全部须要用到的结果,以后的查询直接取这些结果。git
这个是最经常使用到的用法,例如在一个须要查询大量Fibonacci数F(n)的问题中,显然每次从头开始计算是很是耗时的,对Q次查询会产生O(nQ)的时间复杂度;而若是进行预处理,即把全部Fibonacci数预先计算并存在数组中,那么每次查询就只需O(1)的时间复杂度,对Q次查询就值须要O(n+Q)的时间复杂度(其中O(n)是预处理的时间)。算法
二、在程序B中分一次或屡次计算出全部须要用到的结果,手工把结果写在程序A的数组中,而后在程序A中就能够直接使用这些结果。数组
这种用法通常是当程序的一部分过程小号的时间过多,或是没有想到好的算法,所以在另外一个程序中使用暴力算法去i出结果,这样就能直接在源程序中使用这些结果。例如对n皇后问题来讲,若是使用的算法不够好,就容易超时,而能够在本地用程序计算付出对全部n来讲n皇后问题的方案数,而后把算出的结果直接卸载数组中,就能够根据题目输入的n来直接输出结果。函数
三、对一些感受不会作的题目,先用暴力程序计算小范围数据的结果,而后找规律,或许就能发现一些“蛛丝马迹”。spa
这种用法在数据范围很是大时候容易用到,由于这样的题目可能不是用直接能想到的算法来解决的,而须要寻找一些规律才能获得结果。翻译
例题:PAT乙级1044火星数字code
火星人是以13进制计数的: 地球人的0被火星人称为tret。 地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。 火星人将进位之后的12个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。 例如地球人的数字“29”翻译成火星文就是“hel mar”;而火星文“elo nov”对应地球数字“115”。为了方便交流,请你编写程序实现地球和火星数字之间的互译。 输入格式: 输入第一行给出一个正整数N(<100),随后N行,每行给出一个[0, 169)区间内的数字 —— 或者是地球文,或者是火星文。 输出格式: 对应输入的每一行,在一行中输出翻译后的另外一种语言的数字。 输入样例: 4 29 5 elo nov tam 输出样例: hel mar may 115 13
思路:写一个初始化函数,把全部的结果保存下来,在main函数中直接找咱们所须要的数字便可。具体代码以下:blog
#include <iostream> #include <string> #include <cstdio> #include <map> using namespace std; string unitDigit[13]={"tret","jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"}; string tenDigit[13]={"tret","tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou"}; string numToStr[170];//数字->火星文 map<string,int> strToNum;//火星文->数字 void init(){ for(int i=0;i<13;i++){ numToStr[i]=unitDigit[i];//个位是[0,12],十位为0 strToNum[unitDigit[i]]=i; numToStr[i*13]=tenDigit[i];//十位是[0,12],个位是0 strToNum[tenDigit[i]]=i*13; } //如下是除个位数和整十位数以外的转换 for(int i=1;i<13;i++){//十位 for(int j=1;j<13;j++){//个位 string str=tenDigit[i]+" "+unitDigit[j]; numToStr[i*13+j]=str; strToNum[str]=i*13+j; } } } int main(){ init();//打表 int N; scanf("%d%*c",&N); for(int i=0;i<N;i++){ string str; getline(cin,str); if(str[0]>='0'&&str[0]<='9'){//数字 则转换为int数字 int num=0; for(int i=0;i<str.size();i++){ num=num*10+(str[i]-'0'); } cout<<numToStr[num]<<endl; }else{ cout<<strToNum[str]<<endl; } } return 0; }