#dp#洛谷 2467 JZOJ 1582 地精部落

题目

问有多少个 1 ∼ n 1\sim n 1n的排列对于 ∀ i \forall i i 1 < i < n 1<i<n 1<i<n的情况下都满足 a [ i − 1 ] < a [ i ] > a [ i + 1 ] a[i-1]<a[i]>a[i+1] a[i1]<a[i]>a[i+1] a [ i − 1 ] > a [ i ] < a [ i + 1 ] a[i-1]>a[i]<a[i+1] a[i1]>a[i]<a[i+1]


分析

思维好题
首先考虑性质,

  • 对于不相邻的两个数 j , j + 1 j,j+1 j,j+1,可以互换
  • 合法的排列翻转依旧合法
  • 把合法排列每个数 j j j都变成 n − j + 1 n-j+1 nj+1,排列依旧合法

考虑dp,设 d p [ i ] [ j ] dp[i][j] dp[i][j]表示选择 1 ∼ i 1\sim i 1i,第一个数为 j j j,且第一个数大于第二个数的方案,所以最后答案要乘2
因为 j j j j − 1 j-1 j1在不相邻时可以互换,所以 d p [ i ] [ j ] dp[i][j] dp[i][j]可以由 d p [ i ] [ j − 1 ] dp[i][j-1] dp[i][j1]转移而来,接着如果 j j j j − 1 j-1 j1相邻,那么也就转换成选择 1 ∼ i − 1 1\sim i-1 1i1,第一个数为 j − 1 j-1 j1,且第一个数小于第二个数的方案,但是这和定义不符,考虑转换成选择 1 ∼ i − 1 1\sim i-1 1i1,第一个数为 i − j + 1 i-j+1 ij+1,且第一个数大于第二个数的方案,因为如果进行第三条性质,那么原来大的反而小,初始化 d p [ 2 ] [ 2 ] = 1 dp[2][2]=1 dp[2][2]=1
综上所述, d p [ i ] [ j ] = d p [ i ] [ j − 1 ] + d p [ i − 1 ] [ i − j + 1 ] dp[i][j]=dp[i][j-1]+dp[i-1][i-j+1] dp[i][j]=dp[i][j1]+dp[i1][ij+1]


代码

#include <cstdio>
#define rr register
using namespace std;
int n,mod,dp[2][4211],ans;
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
signed main(){
	scanf("%d%d",&n,&mod),dp[0][2]=1;
	for (rr int i=3;i<=n;++i)
	for (rr int j=2;j<=i;++j)
	    dp[i&1][j]=mo(dp[i&1][j-1],dp[(i&1)^1][i-j+1]);
	for (rr int i=2;i<=n;++i) ans=mo(ans,dp[n&1][i]);
	return !printf("%d",mo(ans,ans));
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 【2】项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 【3】项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 【4】如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能,欢迎交流学习。 【注意】 项目下载解压后,项目名字和项目路径不要用中文,否则可能会出现解析不了的错误,建议解压重命名为英文名字后再运行!有问题私信沟通,祝顺利! 基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值