1228--八目鳗烧烤店

1228–八目鳗烧烤店

题目描述

Description

八目鳗烧烤店一共有6个八目鳗,幽幽子一口能吃1到6个八目鳗,求吃完所有的八目鳗共有多少种吃法。
任意一口吃的八目鳗数量不同,就算不同的吃法。

本题无输入输出案例

Input

Output

输出一个整数,表示吃完所有的八目鳗共有多少种吃法。
不要书写任何多余的内容(例如:添加说明文字等)。

思路

如果是要解开这道题的话其实自己手算然后用cout或者是printf输出答案就行了,答案是32。
总共的吃法也就是前面的吃法+1,没什么难度

本题的代码实现


#include
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. 问题拆解
  2. 状态定义
  3. 递推方程,或是转移方程
  4. 代码实现

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]++;
	}
  1. 实现

这里要注意的是:我们需要给dp数组一定的初值,然后再通过for循环不断的递推出剩下的结果

#include
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;
}

你可能感兴趣的:(数据结构与算法,动态规划,算法,c++,oj系统,数学)