题目描述
为了给同学们营造一个良好的学习环境和方便学校的管理,市政府准备对小W就读的学校进行重新规划,占地面积将再次扩大。学校通过领导会议决定,重建学校的围墙。由于学校太大,重建围墙也不是一件小项目,学校决定请专门的建筑公司来建筑。许多建筑公司从网上得知这个消息后,纷纷来到学校,找到学校领导,对自己公司进行介绍,并希望能接下这个项目。学校领导对很多家公司印象都还不错,难以取舍,为了公平,学校决定通过竞标决定把这个项目交给哪家公司负责。这次竞标是由学校自主决定的,不但要注重建筑实力,而且还要看建筑公司是否有足够的智慧。
学校通过两轮选拔。第一轮,选出建筑实力较强的公司。进入第二轮后,由学校专门负责这个项目的领导进行智力考核。
领导说:为了美观,我们准备建设一面2米高的围墙,围墙建好后,墙外要贴上有图画的瓷砖,当然这就需要瓷砖越大越美观了。目前市面用的最大瓷砖是多大?
公司:宽1米,长2米的
领导:哦,我们就用这种吧,我们学校现需建筑N米长的围墙,如果用这种瓷砖来贴,总共有多少种贴法呢?
公司:…………….(正在计算中……………)
输入
只有一个整数N(1<N<10000),表示围墙的长度。输出
只有一个数,表示如果用宽1米、长2米的瓷砖,贴在高2米,长N米的围墙上,最多有多少种不同的贴法?样例输入 Copy
4
样例输出 Copy
5
提示
对于20%的数据,2<N<90;对于60%的数据,2<N ≤1200;
对于100%的数据,2< N<10000。
2*1的时候只有一种方式2*2有两种即| |和= 2*3的时候答案是2*1+2*2+ 就是F[n]=F[n-1]+F[n-2] 最后,10000,要用到高精度加法
查看代码
#include<iostream>
#define int long long
using namespace std;
string ans[10005];
string add(string a,string b)
{
string anss="";
if(a.length()<b.length())swap(a,b);
int t=0;
for(int i=0;i<b.length();i++)
{
int zz=a[i]+b[i]-'0'-'0'+t;
anss.push_back(zz%10+'0');
t=zz/10;
}
for(int i=b.length();i<a.length();i++)
{
int zz=t+a[i]-'0';
anss.push_back(zz%10+'0');
t=zz/10;
}
if(t)anss.push_back(t+'0');
return anss;
}
void print(string s)
{
for(int i=s.length()-1;i>=0;i--)
cout<<s[i];
}
signed main()
{
ans[1]="1";
ans[2]="2";
int n;
cin>>n;
for(int i=3;i<=n;i++)
ans[i]=add(ans[i-1],ans[i-2]);
print(ans[n]);
return 0;
}
标签:string,瓷砖,领导,围墙,高精度,学校,建筑,DP From: https://www.cnblogs.com/qbning/p/17060076.html