洛谷 P1595 信封问题 C语言dp

题目描述

某人写了 n 封信和 n 个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。

输入格式

一个信封数 n,保证 n≤20。

输出格式

一个整数,代表有多少种情况。

输入输出样例

输入 #1

2

输出 #1

1

输入 #2

3

输出 #2

2

说明/提示

对于 100% 的数据,1≤n≤20。

思路:

我们假设一个数组dp[27],我们需要推出有n个信封的时候排错的可能,举例,首先第i个信封放在了k位置上,分为两种情况。

  • 情况一 :原本应该放在位置 k 上的信封也恰好被放置在了位置 i 上。因此,这种情况下剩下的 n-2 个信封需要全部错排,即 dp[i-2] 种方式。
  • 情况二 :原本应该放在位置 k 上的信封不在位置 i 上。所以剩下的 i-1 个信封的错排数实际上是 dp[i-1]
  • 由于这两种情况是互斥的(即它们不能同时发生),所以我们将它们的结果相加,并乘以 (i-1)(因为我们有 i-1 种方式将第 i 个信封放置到其他位置上),从而得到递推关系:dp[i] = (i-1) * (dp[i-1] + dp[i-2])

代码如下:

复制代码
#include<iostream>
using namespace std;
typedef long long ll;
ll dp[27]; 
int main()
{
	ll n;
	cin >> n;
	dp[0] = 1;
	dp[1] = 0;
	for(ll i = 2 ; i <= n ; i++)
	{
		dp[i] = (i-1)*(dp[i-1]+dp[i-2]);
	}
	cout << dp[n];
	return 0;
}
相关推荐
Xの哲學19 分钟前
Linux Netlink全面解析:从原理到实践
linux·网络·算法·架构·边缘计算
Tisfy26 分钟前
LeetCode 3289.数字小镇中的捣蛋鬼:哈希表O(n)空间 / 位运算O(1)空间
算法·leetcode·散列表·题解·位运算·哈希表
2501_9389639639 分钟前
基于音乐推荐数据的逻辑回归实验报告:曲风特征与用户收听意愿预测
算法·机器学习·逻辑回归
2501_9387912243 分钟前
逻辑回归正则化解释性实验报告:L2 正则对模型系数收缩的可视化分析
算法·机器学习·逻辑回归
2501_9387900743 分钟前
逻辑回归正则化参数选择实验报告:贝叶斯优化与网格搜索的效率对比
算法·机器学习·逻辑回归
2501_938780281 小时前
逻辑回归特征重要性排序实验报告:不同特征选择方法的排序一致性验证
算法·机器学习·逻辑回归
而后笑面对1 小时前
cf Codeforces Round 1062 (Div. 4) Editorial的一些反思
算法
MicroTech20252 小时前
MLGO微算法科技发布多用户协同推理批处理优化系统,重构AI推理服务效率与能耗新标准
人工智能·科技·算法
一匹电信狗2 小时前
【牛客CM11】链表分割
c语言·开发语言·数据结构·c++·算法·leetcode·stl
不染尘.2 小时前
图的邻接矩阵实现以及遍历
开发语言·数据结构·vscode·算法·深度优先