[简单DP+高精度]围墙重建

题目描述

为了给同学们营造一个良好的学习环境和方便学校的管理,市政府准备对小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;
}
 

posted @ 2023-01-18 16:04  qbning  阅读(55)  评论(0编辑  收藏  举报
描述