对于数据小又容易超时的题,可以采取打表法

打表就是将所有输入情况的答案保存在代码中,输入数据后直接输出就可以了

打表法具有快速,易行(可以写暴力枚举程序)的特点,缺点是代码可能太大,或者情况覆盖不完

对于不会超时,数据规模适合打表,为了简洁你也可以打表

例一:NOIP2008T2

这道题n<=20完全可以打表,代码(生成答案):

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){freopen("ans.txt","w",stdout);int a[10]={6,2,5,5,4,5,6,3,7,6};int i,j,temp=0,num=0,k,in[2020],n;in[0]=6;for(i=1;i<=2000;i++){k=i;temp=0;while(k){temp+=a[k%10];k/=10;}in[i]=temp;}n=0;Again:num=0;for(i=0;i<=999;i++){for(j=0;j<=999;j++){if(n==in[i]+in[j]+in[i+j]+4) num++;}}printf("%d,",num);if(n<24){n++;goto Again;}return 0;
}

提交代码:

#include<iostream>
using namespace std;
int ans[]={0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,8,9,6,9,29,39,38,65,88,128};
int n;
int main(){cin>>n;cout<<ans[n]<<'\n';return 0;
}

是不是很简洁

例二:骨牌问题[3]

Description

  在《骨牌问题[版本1]》中问题描述为:“有 2 行 n 列的长方形,用 n 个 1*2 的骨牌铺满,请计算有多少种铺法。”我们知道这个问题可用递推算法来解决,递推方程如下:
   d[1]=1;
   d[2]=2;
   d[n]=d[n-1]+d[n-2] (n>2)
  现在我们把这个问题推广一下:“有 m 行 n 列的长方形,用 (m*n)/2 个 1*2 的骨牌铺满,请计算有多少种铺法。

Input

若干行,每行包含两个整数:m,n,表示长方形的行和列的数量。

Output

若干行,每行一个整数,对应输入中的长方形铺满的方案数。

Sample Input 1

1 2
1 3
1 4
2 2
2 3
2 4
2 11
4 11

Sample Output 1

1
0
1
2
3
5
144
51205

Hint

m*n<=121

由于目前主要目的是讲打表法,此题解法不重点说明,反正正解是用的状压DP

这道题m*n<=121完全可以用打表的方法,先状压DP生成表:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,m,ALL;
ll d[121][2058];
int A,B;
void shift(int i,int j,int A_){if(j>n-1){d[i][B]=d[i][B]+d[i-1][A_];return;}if(A_&(1<<j)){B=B&(~(1<<j)); shift(i,j+1,A_);}if(j<n-1&&(A_&(1<<j))&&(A_&(1<<(j+1)))){B|=(1<<j);B|=(1<<(j+1));shift(i,j+2,A_);}if(!(A&(1<<j))){B|=(1<<j);shift(i,j+1,A_);}
}
void dp(){if(n>m) swap(n,m);ALL=(1<<n)-1;memset(d,0,sizeof(d));d[0][ALL]=1;for(int i=0;i<m;i++)for(A=0;A<=ALL;A++){B=0;shift(i+1,0,A);}
}
int main(){freopen("ans.txt","w",stdout);//输出到答案表中 int cnt=0;printf("\t");for(int i=1;i<=121;i++)for(int j=1;i*j<=121;j++) if(i*j%2==0&&i<=j){//枚举情况 n=i;m=j;dp();//状压DP cnt++;printf("f[%d][%d]=%lldLL",i,j,d[m][ALL]);printf("%s",cnt%3?",":";\n\t");//格式控制 }return 0;
}

然后把答案copy到程序中就可以了:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll f[20][150];
int x,y;
void get_V(){f[1][2]=1LL,f[1][4]=1LL,f[1][6]=1LL;f[1][8]=1LL,f[1][10]=1LL,f[1][12]=1LL;f[1][14]=1LL,f[1][16]=1LL,f[1][18]=1LL;f[1][20]=1LL,f[1][22]=1LL,f[1][24]=1LL;f[1][26]=1LL,f[1][28]=1LL,f[1][30]=1LL;f[1][32]=1LL,f[1][34]=1LL,f[1][36]=1LL;f[1][38]=1LL,f[1][40]=1LL,f[1][42]=1LL;f[1][44]=1LL,f[1][46]=1LL,f[1][48]=1LL;f[1][50]=1LL,f[1][52]=1LL,f[1][54]=1LL;f[1][56]=1LL,f[1][58]=1LL,f[1][60]=1LL;f[1][62]=1LL,f[1][64]=1LL,f[1][66]=1LL;f[1][68]=1LL,f[1][70]=1LL,f[1][72]=1LL;f[1][74]=1LL,f[1][76]=1LL,f[1][78]=1LL;f[1][80]=1LL,f[1][82]=1LL,f[1][84]=1LL;f[1][86]=1LL,f[1][88]=1LL,f[1][90]=1LL;f[1][92]=1LL,f[1][94]=1LL,f[1][96]=1LL;f[1][98]=1LL,f[1][100]=1LL,f[1][102]=1LL;f[1][104]=1LL,f[1][106]=1LL,f[1][108]=1LL;f[1][110]=1LL,f[1][112]=1LL,f[1][114]=1LL;f[1][116]=1LL,f[1][118]=1LL,f[1][120]=1LL;f[2][2]=2LL,f[2][3]=3LL,f[2][4]=5LL;f[2][5]=8LL,f[2][6]=13LL,f[2][7]=21LL;f[2][8]=34LL,f[2][9]=55LL,f[2][10]=89LL;f[2][11]=144LL,f[2][12]=233LL,f[2][13]=377LL;f[2][14]=610LL,f[2][15]=987LL,f[2][16]=1597LL;f[2][17]=2584LL,f[2][18]=4181LL,f[2][19]=6765LL;f[2][20]=10946LL,f[2][21]=17711LL,f[2][22]=28657LL;f[2][23]=46368LL,f[2][24]=75025LL,f[2][25]=121393LL;f[2][26]=196418LL,f[2][27]=317811LL,f[2][28]=514229LL;f[2][29]=832040LL,f[2][30]=1346269LL,f[2][31]=2178309LL;f[2][32]=3524578LL,f[2][33]=5702887LL,f[2][34]=9227465LL;f[2][35]=14930352LL,f[2][36]=24157817LL,f[2][37]=39088169LL;f[2][38]=63245986LL,f[2][39]=102334155LL,f[2][40]=165580141LL;f[2][41]=267914296LL,f[2][42]=433494437LL,f[2][43]=701408733LL;f[2][44]=1134903170LL,f[2][45]=1836311903LL,f[2][46]=2971215073LL;f[2][47]=4807526976LL,f[2][48]=7778742049LL,f[2][49]=12586269025LL;f[2][50]=20365011074LL,f[2][51]=32951280099LL,f[2][52]=53316291173LL;f[2][53]=86267571272LL,f[2][54]=139583862445LL,f[2][55]=225851433717LL;f[2][56]=365435296162LL,f[2][57]=591286729879LL,f[2][58]=956722026041LL;f[2][59]=1548008755920LL,f[2][60]=2504730781961LL,f[3][4]=11LL;f[3][6]=41LL,f[3][8]=153LL,f[3][10]=571LL;f[3][12]=2131LL,f[3][14]=7953LL,f[3][16]=29681LL;f[3][18]=110771LL,f[3][20]=413403LL,f[3][22]=1542841LL;f[3][24]=5757961LL,f[3][26]=21489003LL,f[3][28]=80198051LL;f[3][30]=299303201LL,f[3][32]=1117014753LL,f[3][34]=4168755811LL;f[3][36]=15558008491LL,f[3][38]=58063278153LL,f[3][40]=216695104121LL;f[4][4]=36LL,f[4][5]=95LL,f[4][6]=281LL;f[4][7]=781LL,f[4][8]=2245LL,f[4][9]=6336LL;f[4][10]=18061LL,f[4][11]=51205LL,f[4][12]=145601LL;f[4][13]=413351LL,f[4][14]=1174500LL,f[4][15]=3335651LL;f[4][16]=9475901LL,f[4][17]=26915305LL,f[4][18]=76455961LL;f[4][19]=217172736LL,f[4][20]=616891945LL,f[4][21]=1752296281LL;f[4][22]=4977472781LL,f[4][23]=14138673395LL,f[4][24]=40161441636LL;f[4][25]=114079985111LL,f[4][26]=324048393905LL,f[4][27]=920471087701LL;f[4][28]=2614631600701LL,f[4][29]=7426955448000LL,f[4][30]=21096536145301LL;f[5][6]=1183LL,f[5][8]=14824LL,f[5][10]=185921LL;f[5][12]=2332097LL,f[5][14]=29253160LL,f[5][16]=366944287LL;f[5][18]=4602858719LL,f[5][20]=57737128904LL,f[5][22]=724240365697LL;f[5][24]=9084693297025LL,f[6][6]=6728LL,f[6][7]=31529LL;f[6][8]=167089LL,f[6][9]=817991LL,f[6][10]=4213133LL;f[6][11]=21001799LL,f[6][12]=106912793LL,f[6][13]=536948224LL;f[6][14]=2720246633LL,f[6][15]=13704300553LL,f[6][16]=69289288909LL;f[6][17]=349519610713LL,f[6][18]=1765722581057LL,f[6][19]=8911652846951LL;f[6][20]=45005025662792LL,f[7][8]=1292697LL,f[7][10]=53175517LL;f[7][12]=2188978117LL,f[7][14]=90124167441LL,f[7][16]=3710708201969LL;f[8][8]=12988816LL,f[8][9]=108435745LL,f[8][10]=1031151241LL;f[8][11]=8940739824LL,f[8][12]=82741005829LL,f[8][13]=731164253833LL;f[8][14]=6675498237130LL,f[8][15]=59554200469113LL,f[9][10]=14479521761LL;f[9][12]=1937528668711LL,f[10][10]=258584046368LL,f[10][11]=3852472573499LL;f[10][12]=65743732590821LL;
}
int main(){get_V();while(scanf("%d%d",&x,&y)==2){if(x>y) swap(x,y);printf("%lld\n",f[x][y]);}return 0;
}

值得注意的是,long long赋值的时候建议加上LL后缀

还有,当m*n为奇数是由于全局变量默认为0,正好输出0

例三:

【训练题】错排问题

Description

  班里出了各淘气包,经常搞的老师哭笑不得。淘气包今天将班里每个同学的钥匙放在别人的橱柜里,这样每个人的橱柜里放着的都不是自己的钥匙。当然,也就都锁不上自己的橱柜了。

  老师对淘气包说:“你在考验老师,那么老师也考考你,好不好?”淘气包跃跃欲试,老师的问题是:淘气包这种放置钥匙的方法,会有多少种不同的情况呢?

Input

一个整数n:橱柜的个数即不同钥匙的个数(n<=12)

Output

一个整数:不同的方案数。

Sample Input 1

3

Sample Output 1

2

Hint

n<=12

这道题其实是一个数学或动态规划(递推)题,面对n<=12的规模暴力排列生成超时,也可以打表

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[20],n,ans[20]={0,0,1,2,9,44,265,1854,14833,133496,1334961,14684570,176214841};
/*
bool judge(int w){for(int i=1;i<=w;i++){if(a[i]==i) return false;}return true;
}
*/
int main(){
/*
递推方程分析:
1.分析:暴力枚举加打表
2.现在我会分析了:f(i)=(i-1)(f(i-1)+f(i-2))
方法:设两个递推方程,消去一个就可以了
f(n+1)=n*g(n)    g(n)=(n-1)*g(n-1)+f(n-1)
*/
/*for(int n=2;n<=12;n++){ans[n]=0;for(int i=1;i<=n;i++) a[i]=i;while(next_permutation(a+1,a+n+1)){if(judge(n)) ans[n]++;}printf("%d,",ans[n]);}
*/scanf("%d",&n);printf("%d\n",ans[n]);return 0;
}

其他应用:

a.生成小范围的素数表,欧拉函数表

b.生成某些需要的常数

信息竞赛--打表法讲解相关推荐

  1. 2022暑初二信息竞赛学习成果分享2

    学习目录2 第二期 (2022/07/17~2022/07/23) Day 7:复习&测试--**树状数组** `Morning`--树状数组复习测试 考试"游记" 题目总 ...

  2. ML之FE:特征工程中常用的五大数据集划分方法(特殊类型数据分割,如时间序列数据分割法)讲解及其代码

    ML之FE:特征工程中常用的五大数据集划分方法(特殊类型数据分割,如时间序列数据分割法)讲解及其代码 目录 特殊类型数据分割 5.1.时间序列数据分割TimeSeriesSplit 特殊类型数据分割 ...

  3. 多边形填充算法-有序边表法(扫描线算法) 计算机图形学

    1.算法的基本思想(扫描线连贯性原理): 对于一个给定的多边形,用一组水平(垂直)的扫描线进行扫描,对每一条扫描线均可求出与多边形边的交点,这些交点将扫描线分割成落在多边形内部的线段和落在多边形外部的 ...

  4. 多边形填充算法-有序边表法(扫描线算法)

    1.算法的基本思想(扫描线连贯性原理): 对于一个给定的多边形,用一组水平(垂直)的扫描线进行扫描,对每一条扫描线均可求出与多边形边的交点,这些交点将扫描线分割成落在多边形内部的线段和落在多边形外部的 ...

  5. 常用crc查表法_CRC校验码简介及CRC16的计算方法

    点击上方"嵌入式从0到1",选择"置顶/星标公众号" 干货福利,第一时间送达! 什么是CRC校验? CRC即循环冗余校验码(Cyclic Redundancy ...

  6. 软件测试用例设计方法-判定表法

    接下来4篇分享的测试用例方法,实际工作中不常用,但是能够为测试用例提供设计思路. 首先分享的是,判定表法. 等价类划分法和边界值法着重考虑输入条件,但是忽略了输入条件的各种组合.输入条件之间的相互制约 ...

  7. LUT查表法乘法器所犯下错误。。。。

    程序参见黑金时序篇一章实验五LUT查表法实验,不同的是LUT我用了一个ROM来实现,word depth 256,word size 16,数据用matlab生成,发现matlab确实好强大,不用操作 ...

  8. php取雅加达时间,2018年雅加达亚运会电竞赛程表 8月电子竞技比赛时间一览

    2018年世界杯世界足球赛事已经过去有一个月时间了,如今迎来了同样备受关注的体育盛事,雅加达亚运会,在今年的雅加达亚运会上,有一件具有突破性意义的赛事,那就是电子竞技作为表演赛项目参与.更为有幸的是腾 ...

  9. MySQL字段约束及多表查询---讲解三

    MySQL环境配置(mysql有下载包) MySQL数据库表的基础操作(增删改查)-讲解一 MySQL数据库表的模糊/多行/分组/排序/分页查询以及字mysql数据类型的讲解-讲解二 MySQL字段约 ...

最新文章

  1. ubuntu下svn命令
  2. Jenkins分层作业和作业状态汇总
  3. 文档服务器archive,文档查询服务器,archive server,音标,读音,翻译,英文例句,英语词典...
  4. Mac-删除自带 ABC 输入法的方法
  5. office2016卸载
  6. R语言使用lmPerm包应用于线性模型的置换方法(置换检验、permutation tests)、使用lm模型构建多元线性回归模型、使用lmp函数生成置换检验多元线性回归模型
  7. WebRTC源码下载与编译
  8. absolute导致的高度塌陷问题——解决方法
  9. docker安装Mysql
  10. 将动网论坛验证码修改为算术运算提问的验证码
  11. 卡耐基人性的弱点目录
  12. 误差反向传播算法(BP网络)
  13. 秋招上岸!双非本科,从外包实习到秋招收获阿里、美团、B站意向书!
  14. 【转】iOS弹幕库OCBarrage-如何hold住每秒5000条巨量弹幕
  15. CAN接口芯片TJA1050, PCA82C251T 和MCP2515T等器件的国产替代方案推荐
  16. 赛后补题:2022CCPC绵阳 A. Ban or Pick, What‘s the Trick
  17. 数据库系列之TiDB备份恢复
  18. 二、Mutisim仿真软件使用
  19. c语言成绩存储的算法思想,[蓝桥杯][算法提高VIP]分数统计 (C语言代码)。。。。。还算简单,但是看错数字,导致开的内存不够。。。浪费了半个多小时。...
  20. Promise、数组的升维与降维

热门文章

  1. 别再乱打日志了,这份 Java 日志规范,应有尽有,建议收藏!
  2. 彩票销量10年来首降,中国彩票没人买了?
  3. 多迪课程教研揭秘:优秀的UI设计师具备怎样的好习惯?
  4. DPA——差分能量分析(Differential Power Analysis)
  5. 个性化电商广告推荐系统介绍
  6. JAVA练习小游戏——本地双人联机乒乓球小游戏
  7. [samtools]mpileup命令简介
  8. 蓝讯之蓝牙测试盒实物图:
  9. 【送书】JS犀牛书 中文版 第7版强势回归!
  10. SINAMICS S120驱动器控制方式分享