1228–八目鳗烧烤店
题目描述
Description
八目鳗烧烤店一共有6个八目鳗,幽幽子一口能吃1到6个八目鳗,求吃完所有的八目鳗共有多少种吃法。
任意一口吃的八目鳗数量不同,就算不同的吃法。
本题无输入输出案例
Input
无
Output
输出一个整数,表示吃完所有的八目鳗共有多少种吃法。
不要书写任何多余的内容(例如:添加说明文字等)。
思路
如果是要解开这道题的话其实自己手算然后用cout或者是printf输出答案就行了,答案是32。
总共的吃法也就是前面的吃法+1,没什么难度
本题的代码实现
#include<iostream>
using namespace std;
int f(int n)
{
int* dp = new int[n+1](),i,j;
dp[0] = 0;
dp[1] = 1;
for (i = 2; i <= n; i++)
{
for (j = 1; j <i &&j<=6; j++)
dp[i] += dp[j];
dp[i]++;
}
return dp[n];
}
int main()
{
int N;
cout << f(6);
return 0;
}
拓展
其实看到题目,第一反应应该是这是一道 动态规划类型 的题目,但是由于出题人的问题,没有很好的体现出来,导致本题直接死算就可以得出结果,或是直接用两个for循环就可以得出答案
这里我讲讲动态规划的分析吧
动态规划的分析
- 问题拆解
- 状态定义
- 递推方程,或是转移方程
- 代码实现
1.问题拆解
由题目的描述可以知道:
每次可以吃1~6个章鱼,简单的从只有两个章鱼的时候开始分析
一个章鱼只有一种吃法,而两个章鱼有两种:一口吃一个或者直接吃两个
题目的重点:
任意一口吃的八目鳗数量不同,就算不同的吃法。
- 这也就是问题拆解最核心的部分了
无论是多少个章鱼,我们能一下吃6口,就能一下吃1~5口,以此类推 - 问题就拆解完毕了:我们将吃n个章鱼分成n+1个部分,
(因为数组下标是从0开始,动态规划的核心就是利用储存计算结果达到缩短时间的目的)
每个部分都分成 1~n-1个部分,也就是不同的吃法。
2.状态定义
用一个dp[n+1]的数组来储存计算结果
那么dp[ i ] ,就是吃 i 个章鱼一共有多少种方法
3.递推方程
for (i = 2; i <= n; i++)
{
//一下最多吃6口,吃i口总共的吃法由吃1~i-1口的吃法组成
for (j = 1; j <i &&j<=6; j++)
dp[i] += dp[j];
dp[i]++;
}
- 实现
这里要注意的是:我们需要给dp数组一定的初值,然后再通过for循环不断的递推出剩下的结果
#include<iostream>
using namespace std;
int f(int n)
{
int* dp = new int[n+1](),i,j;
dp[0] = 0;//0个章鱼只有0种吃法
dp[1] = 1;//1个章鱼只有1种吃法
for (i = 2; i <= n; i++)
{
for (j = 1; j <i &&j<=6; j++)
dp[i] += dp[j];
dp[i]++;
}
return dp[n];
}
int main()
{
int N;
cout << f(6);
return 0;
}