题意:在1*n的格子上放木人,两个木人之间间隔至少为2,问至少放个一个木人的情况有几种
思路:算是经典DP了吧..
DP[i]表示长度为i的方法数
那么对于每一个位置有两种决策:
1,如果不在第i个位置放,那么有DP[i - 1]种方法;
2,如果在i这个位置放,那么有DP[i - 3] +1种方法,多了一个只在这个位置放的情况;
所以DP[i] = DP[i - 1] + 1 + DP[i - 3]
Trick:要开long long,n接近60的时候会爆int
#include <stdio.h>
#include <iostream>
#include <cstring>
using namespace std;
long long dp[65]={0,1,2,3};
void init()
{
for(int i=4;i<=60;i++)
dp[i]=dp[i-1]+dp[i-3]+1;
}
int main()
{
init();
int n;
while(~scanf("%d",&n))
{
printf("%lld\n",dp[n]);
}
return 0;
}
题目