http://acm.hdu.edu.cn/showproblem.php?pid=2047
写这道题代码不是关键的,因为只要知道公式就非常简单,DP的题就是难在推导过程。如下:
设n位字符串,最后一位是O的字符串的个数为a[n],最后一位不是O的字符串的个数是b[n], 总字符串个数为x[n], 则有 x[n]=a[n]+b[n]; a[n]=b[n-1]; b[n]=2*x[n-1]; ====>x[n]=2*x[n-1]+2*x[n-2]
a[n]=b[n-1];这里很关键,因为上一次这里最后一定不是O,所以这一次在上一次最后加上O即可。
**还有一个比较有意思的公式a[i]=a[i-2]*6+a[i-3]*4;**只能说这类题方法很多,我还是需要多学习。
#include <stdio.h> #include <string.h> int main() { long long a[45]; a[0]=3;a[1]=8; int n; while(scanf("%d",&n)!=EOF) {for(int i=2;i<=n;i++) a[i]=(a[i-1]+a[i-2])*2; printf("%lld\n",a[n-1]); } }