http://acm.nyist.net/JudgeOnline/problem.php?pid=252
直接打表,记录长度为K的时候末尾为0的个数和末尾为1的个数,转移方程就是 dp[i][0] = dp[i-1][1] + dp[i-1][0]; dp[i][1] = dp[i-1][0];
NYIST的好处就是。。做完有标程(或者比较好的程序)可以看,嘿嘿。。。看标程直接斐波那契数列搞定了。我表示十分ym。。。
虽然从我的这个转移方程还是能看出来是FIB的,但是。。。如何一眼就能看出来是FIB呢。。。。T T。。。需要功力啊。。
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>
using namespace std;
const int MAX = 45;
int dp[MAX][2];
void init()
{
memset(dp,0,sizeof(dp));
dp[1][0] = 1;
dp[1][1] = 1;
for(int i=2; i<=40; i++)
{
dp[i][0] = dp[i-1][1] + dp[i-1][0];
dp[i][1] = dp[i-1][0];
}
}
int main()
{
int n,ncases;
init();
scanf("%d",&ncases);
while( ncases-- )
{
scanf("%d",&n);
printf("%d\n",dp[n][0] + dp[n][1]);
}
return 0;
}