标签:10 int YbtOJ jw long while include 递推 DP
思路
首先读题可得设
f
[
i
]
f[i]
f[i] 表示
2
∗
i
2*i
2∗i 时的方案数。
因为边最长是2,所以考虑从
f
[
i
−
1
]
f[i-1]
f[i−1] 和
f
[
i
−
2
]
f[i-2]
f[i−2] 转移。
i
−
2
i-2
i−2 时的情况:
i
−
1
i-1
i−1 时只有可能有一条竖着的,所以直接继承
f
[
i
−
1
]
f[i-1]
f[i−1]。
当然此时存在了重复,
i
−
2
i-2
i−2 的两条竖着的情况和
i
−
1
i-1
i−1 的情况发生了冲突,
所以直接把
i
−
2
i-2
i−2 的情况剔除即可。
需要高精度。
C o d e Code Code
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long f[300][101];
int n,m;
void gjc(int x)
{
int jw=0;
for(int i=1; i<=f[x-2][0]+1; i++)
{
f[x][i]=(f[x-2][i]*2)%10+jw;
jw=(f[x-2][i]*2)/10;
}
if(f[x][f[x-2][0]+1]!=0)
f[x][0]=f[x-2][0]+1;
else
f[x][0]=f[x-2][0];
}
void gjj(int x)
{
int jw=0;
for(int i=1; i<=f[x][0]+1; i++)
{
int g=(f[x][i]+f[x-1][i]+jw);
f[x][i]=g%10;
jw=g/10;
}
if(f[x][f[x][0]+1]!=0)
f[x][0]=f[x-1][0]+1;
}
int main()
{
f[1][1]=1,f[2][1]=3,f[1][0]=1,f[2][0]=1;
for(int i=3; i<=250; i++)
{
gjc(i);
gjj(i);
}
//f[i]=f[i-2]*2+f[i-1];
while(cin>>n)
{
int i=f[n][0];
while(f[n][i]==0)
i--;
for(int i=f[n][0]; i>=1; i--)
cout<<f[n][i];
cout<<endl;
}
return 0;
}
标签:10,int,YbtOJ,jw,long,while,include,递推,DP 来源: https://blog.csdn.net/Jackma_mayichao/article/details/111705146
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。