递推求解的基本方法hdu2044-2047

纯递推HDU2044一只小蜜蜂
http://acm.hdu.edu.cn/showproblem.php?pid=2044
int main()
{
long long f[100],t,a,b,n,temp;
scanf(“%lld”,&t);
while(t–)
{
scanf(“%lld %lld”,&a,&b);
if(a>b)
temp=a,a=b,b=temp;
f[0]=f[1]=1;
n=b-a+1;
for(int i=2;i<=n;i++)
f[i]=f[i-1]+f[i-2]; //到第I个蜂房的方式等于到第I个蜂房紧挨着的左边两个的方式的和
printf(“%lld\n”,f[n-1]);
}
return 0;
}

HDU2045不容易系列之(3)—— LELE的RPG难题
http://acm.hdu.edu.cn/showproblem.php?pid=2045
int main(){
int n,i;
long long f[10005]={0,3,6,6};
for(i=4;i<=50;i++)
f[i]=f[i-1]+2*f[i-2];//如果前i+1个色块是合法的那最后一块的颜色唯一有f[i-1]种可能;如果前f[i-1]不合法但是加一块后合法,那说明其不合法是因为收尾色块想同故此时f[i-2]是合法的,此时最后一块有两个颜色可以选择2*f[i-2]
while(scanf(“%d”,&n)!=EOF)
printf(“%lld\n”,f[n]);
return 0;
}

HDU 2046骨牌铺方格
http://acm.hdu.edu.cn/showproblem.php?pid=2046
这道题有坑要模拟大数
我开始是这样写的一直wa(关于大数模拟我现在只会加法后面会再总结)
int f[32];
int main()
{
int n,i;
f[1]=1;
f[2]=2;
f[3]=3;
for(i=4;i<=20;i++)
f[i]=f[i-1]+f[i-2];//这个就不用解释了吧
while(~scanf(“%d”,&n))
printf(“%d\n”,f[n]);
return 0;
}
AC码如下
int f[52][300];
int main()
{
int n,i,j,t;
f[1][0]=1;
f[2][0]=2;
f[3][0]=3;
for(i=4;i<=50;i++)
{
t=0;
for(j=0;j<300;j++)
{
f[i][j]=f[i-1][j]+f[i-2][j]+t;
t=f[i][j]/10;
f[i][j]=f[i][j]%10;
}
}
//printf(“%d**”,f[50][0]);
while(~scanf(“%d”,&n))
{
int k=299;
while(k>=0&&!f[n][k])
k–; //把后面为0的那些排除
while(k>=0)
printf(“%d”,f[n][k–]);
printf(“\n”);
}
return 0;
}

HDU2047阿牛的EOF牛肉串
http://acm.hdu.edu.cn/showproblem.php?pid=2047
限制条件是不能出现两个O相邻,那在已知f(1)到f(n-1)的前提下,求f(n)的值得时候,如果为E或者F的话,那就在之前的基础上随意放,没有限制,E,F都行一共就是2*f(n-1)种方案;如果最后一个为O的时候,需要考虑限制条件,那倒数第二个肯定不能放O,只能是E和F,那就和上面一样了一共有2*f(n-2)中方案,所以递推关系式为:f(n)=2*(f(n-1)+f(n-2));//开始的时候我想的是假设前n-1个合适,第n-1个不为’O’则最后一个有3种选择,第n-1个是‘O’最后一个有两种刻法,这是不正确的的http://blog.csdn.net/lostaway/article/details/5742571这个博主讲的挺好,关于子结构的选取还是这道题,很清楚
AC码
long long f[42];
int main() {
int n,i,j,t;
f[1]=3;
f[2]=8;
for(i=3; i<40; i++) {
f[i]=f[i-1]*2+f[i-2]*2;
}
while(~scanf(“%d”,&n)) {
printf(“%lld”,f[n]);
printf(“\n”);
}
return 0;
}

发布了15 篇原创文章 · 获赞 1 · 访问量 4153

猜你喜欢

转载自blog.csdn.net/jingli456/article/details/78768892