URAL 1260 Nudnik Photographer(递推)

本文探讨了如何通过动态规划解决排列问题,限制为任意两个相邻的数之间的差不能超过2。提供了算法实现和关键步骤解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题意 : 给你1到n这n个数,排成一排,然后1放在左边最开始,剩下的数进行排列,要求排列出来的数列必须满足任何两个相邻的数之间的差不能超过2,问你有多少种排列

思路 : 对于dp[n], n个人时求F[n]。第2个位置放2时有F[n-1]种;第2个位置放3,第3个位置放2,第4个位置只能放4,有F[n-3]种;第2个位置放3,第3个位置放5,13578642,有1种;第2个位置放3,第3个位置不能放4。      

所以:

1、12……(dp[n-1])

2、1324……(dp[n-3])

3、1357……8642(一种确定的情况)

 1 //URAL 1260
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <iostream>
 5 
 6 using namespace std ;
 7 int dp[57] ;
 8 
 9 void chart()
10 {
11     dp[1] = dp[2] = 1 ;
12     dp[3] = 2 ;
13     for(int i = 4 ; i <= 56 ; i++)
14         dp[i] = dp[i-1]+dp[i-3]+1 ;
15 }
16 int main()
17 {
18     int n ;
19     chart() ;
20     while(~scanf("%d",&n))
21     {
22         printf("%d\n",dp[n]) ;
23     }
24     return 0 ;
25 }
View Code

 

转载于:https://www.cnblogs.com/luyingfeng/p/3663605.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值