ybtoj递推平铺方案
Posted conprour
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ybtoj递推平铺方案相关的知识,希望对你有一定的参考价值。
题意
题解
非常水的小递推,转移十分显然。
唯一特殊的就是要用高精,很久没写了,贴个模板上来纪念一下。
如果有时间再把压位高精补了。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
inline ll read()
{
ll ret=0;char ch=\' \',c=getchar();
while(!(c>=\'0\'&&c<=\'9\')) ch=c,c=getchar();
while(c>=\'0\'&&c<=\'9\') ret=(ret<<1)+(ret<<3)+c-\'0\',c=getchar();
return ch==\'-\'?-ret:ret;
}
int n;
struct haa
{
int a[1005],len=1;
haa(){}
haa(int x)
{
memset(a,0,sizeof(a));len=1;
while(x){a[len++]=x%10;x/=10;} len--;
}
}f[255];
haa operator + (const haa &a,const haa &b)//高精加高精
{
haa ret=0;ret.len=max(a.len,b.len)+1;
int up=0;
for(int i=1;i<=ret.len;i++)
{
ret.a[i]+=a.a[i]+b.a[i]+up;
up=ret.a[i]/10;
ret.a[i]%=10;
}
while(ret.len>1&&!ret.a[ret.len]) ret.len--;
return ret;
}
haa operator * (const haa &a,const int b)//高精乘低精
{
haa ret=0;ret.len=a.len+1;
int up=0;
for(int i=1;i<=ret.len;i++)
{
ret.a[i]=a.a[i]*b+up;
up=ret.a[i]/10;
ret.a[i]%=10;
}
while(ret.len>1&&!ret.a[ret.len]) ret.len--;
return ret;
}
int main()
{
f[1]=1,f[2]=3;
n=250;
for(int i=3;i<=n;i++) f[i]=f[i-2]*2+f[i-1];
int k;
while(scanf("%d",&k)!=EOF)
{
for(int i=f[k].len;i>=1;i--)
printf("%d",f[k].a[i]);
printf("\\n");
}
return 0;
}
以上是关于ybtoj递推平铺方案的主要内容,如果未能解决你的问题,请参考以下文章
ybtoj 状压DP课堂过关 例题1jzoj 1266 luogu P1879 [USACO06NOV]Corn Fields G & 玉米田 & 种植方案