不容易系列之一

文章目录

  • 题目描述
  • 知识点
  • 实现
    • 码前思考
    • 实现代码
    • 码后反思

题目描述

不容易系列之一_第1张图片

知识点

递推,动态规划?

实现

码前思考

  1. 由于之前已经做了一道类斐波拉契数列问题,所以我知道了得用long long来存储结果使用打表
  2. 动态规划的一个重点是找到原问题与子问题之间的状态转移方程。由于之前做的那道类斐波拉契数列问题,我知道了得来分类解决。
    不容易系列之一_第2张图片

实现代码

//使用动态规划来进行求解
//其实应该是递推,感觉叫动态规划不太行呀 
#include "bits/stdc++.h"

using namespace std;

//输入的数据
int n;
//记得考虑输入的数据过大的情况,所以用long long,采用打表的方式 
//经过计算器验算,long long刚好可以的! 
long long dp[21]; 

int main(){
	dp[1]=0;
	dp[2]=1;
	for(int i=3;i<=20;i++){
		dp[i] = (i-1)*(dp[i-1]+dp[i-2]);
	}
	
	while(~scanf("%d",&n)){
		printf("%lld\n",dp[n]);
	} 
	
	return 0;
} 

码后反思

看过两例递推求解例题后,我们总结其特点:

  1. 数据结构:递推求解问题,根据输入的顺序,其答案往往排列成一个数列
  2. 递推边界:为求得数列中的每一个数字,我们首先得到输入规模较小的答案,即数列开头的几个数字;
  3. 递推关系式:分析问题,将每一个问题都分割成规模较小的几个问题,分割过程是从大到小分割,而不是从小到大合并!)中要做到不遗漏不重复,并确定它们的关系从而得到递推关系式

你可能感兴趣的:(#,动态规划)