http://codevs.cn/problem/2618/
记忆化搜索+递归
每一个坑可能装东西也可能不装东西,所以诞生出来递归的两种状态。
继续放东西,或这中断放东西。题目只告诉了最多连续放多少个没有说一共放多少个,所以还是比较好理解的。
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
int n, m;
long long a[55][55] = { 0 };
long long dfs(int i, int j)
{
if (j==m)
{
return 0;
}
if (i==n)
{
return 1;
}
if (a[i][j]!=0)
{
return a[i][j];
}
return a[i][j] = dfs(i+1,j+1) + dfs(i+1,0);
}
int main()
{
cin >> n>>m;
dfs(0, 0);
cout << a[0][0] << endl;
system("pause");
return 0;
}