不容易系列之一

题目描述

在这里插入图片描述

知识点

递推,动态规划?

实现

码前思考

  1. 由于之前已经做了一道类斐波拉契数列问题,所以我知道了得用long long来存储结果使用打表
  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. 递推关系式:分析问题,将每一个问题都分割成规模较小的几个问题,分割过程是从大到小分割,而不是从小到大合并!)中要做到不遗漏不重复,并确定它们的关系从而得到递推关系式
发布了135 篇原创文章 · 获赞 3 · 访问量 3649
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览