题单简介
有些目标是宏大的,比如要在 IOI 赛场中得到满分(俗称 AK IOI)。如果你现在还是一个普通的学生,那么想达成这个目标太难了。但把这样宏大的目标分解为很多个子任务,就没觉得那么复杂了。
要想 AK IOI,只需要入选国家队,参加 IOI 即可。那怎么成为入选国家队呢?参加中国队选拔赛并通过面试答辩即可。使用同样的思路往前倒推,直到最后只剩下最基础的任务(比如认真的读完这章内容并完成练习),做完这样的小任务就很简单了。
像这样将一个很大的任务分解成规模小一些的子任务,子任务分成更小的子任务,直到遇到初始条件,最后整理归纳解决大任务的思想就是递推与递归思想,不过这两者还是有一些区别。
这一章涉及的内容是动态规划思想与分治策略的基础,大家也要认真学习啦,说不定目标就真的达到了。
1. 数楼梯
题目描述
楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
输入输出样例
输入 #1
4
输出 #1
5
说明/提示
对于 60% 的数据,N≤50
对于 100% 的数据,N≤5000。
50分题解(int)
#include#include#include#include#include#include#include#include#includeusing namespace std;int dp[5005];int main(){ int n; cin>>n; switch(n) { case 1:cout<<1;exit(0); case 2:cout<<2;exit(0); } dp[0]=0; dp[1]=1; dp[2]=2; for(int i=3;i<=n;i++) { dp[i]=dp[i-1]+dp[i-2]; } cout< return 0;}
60分题解(long long)
#include#include#include#include#include#include#include#include#includeusing namespace std;long long dp[5005];int main(){ long long n; cin>>n; switch(n) { case 1:cout<<1;exit(0); case 2:cout<<2;exit(0); } dp[0]=0; dp[1]=1; dp[2]=2; for(int i=3;i<=n;i++) { dp[i]=dp[i-1]+dp[i-2]; } cout< return 0;}
100分代码
#include#include#include#include#includeusing namespace std;string f(string a,string b){ int x[2005],y[2005]; int c[2005]; memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); memset(c,0,sizeof(c)); reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); for(int i=0;i { x[i]=a[i]-'0'; } for(int i=0;i { y[i]=b[i]-'0'; } for(int i=0;i { c[i]+=x[i]+y[i]; c[i+1]+=c[i]/10; c[i]%=10; } bool f=0; string q=""; for(int i=max(a.size(),b.size());i>=0;i--) { if(c[i]!=0||i==0) { f=1; } if(f==1) { q+=c[i]%10+'0'; } } return q;}int main(){ int n; cin>>n; if(n==0) { cout<<0; return 0; } string mm="1"; string nn="1"; n--; while(n--) { string qq=f(mm,nn); mm=nn; nn=qq; } cout<}
2.外星密码
题目描述
有了防护伞,并不能完全避免 2012 的灾难。地球防卫小队决定去求助外星种族的帮 助。经过很长时间的努力,小队终于收到了外星生命的回信。但是外星人发过来的却是一 串密码。只有解开密码,才能知道外星人给的准确回复。解开密码的第一道工序就是解压 缩密码,外星人对于连续的若干个相同的子串“X”会压缩为“[DX]”的形式(D 是一个整 数且 1≤D≤99),比如说字符串“CBCBCBCB”就压缩为“[4CB]”或者“[2[2CB]]”,类 似于后面这种压缩之后再压缩的称为二重压缩。如果是“[2[2[2CB]]]”则是三重的。现 在我们给你外星人发送的密码,请你对其进行解压缩。
输入格式
第一行:一个字符串
输出格式
第一行:一个字符串
输入输出样例
输入 #1
AC[3FUN]
输出 #1
ACFUNFUNFUN
说明/提示
【数据范围】
对于 50%的数据:解压后的字符串长度在 1000 以内,最多只有三重压缩。
对于 100%的数据:解压后的字符串长度在 20000 以内,最多只有十重压缩。
对于 100%的数据:保证只包含数字、大写字母、’[‘和’]‘
代码
#includeusing namespace std;string read(){ int n; string s="",s1; char c; while (cin>>c) { if (c=='[') { cin>>n; s1=read(); while (n--) s+=s1; } else { if (c==']') return s; else s+=c; } }}int main(){ cout< return 0;}