间接法:
第一个位置有3种,后i-1个位置每个都是2选1,有2^(i-1),总数为3*2^(i-1);
第一个和最后一个不能相同,减去f[n-1]乘以最后插一个相同的情况,即f[n-1];
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
int n;
double f[51];
f[1]=3;
f[2]=6;
for(int i=3; i<51; i++)
f[i]=3*pow(2,i-1)-f[i-1];
while(scanf("%d",&n)!=EOF)
{
printf("%.0f\n",f[n]);
}
return 0;
}直接法:
若n-1个与第一个不同,最后一个只有一种解,有f[n-1]*1;
若n-1个与第一个一样,最后一个有2解,有f[n-2]*1*2;
PS:这里的n要从4开始,否则没有以上2种情况讨论;
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
int n;
double f[51];
f[1]=3;
f[2]=6;
f[3]=6;
for(int i=4; i<51; i++)
f[i]=f[i-1]+2*f[i-2];
while(scanf("%d",&n)!=EOF)
{
printf("%.0f\n",f[n]);
}
return 0;
}
hdu2045 不容易系列之(3)—— LELE的RPG难题
原文地址:http://blog.csdn.net/loolu5/article/details/41258135