• 洛谷P2401 不等数列 题解


    可食用的题目链接

    题解:

    有题目得:这个题有巧做法而不是暴力模拟。废话

    这个题看着像一道dp,因为可以由前一种(数据更小的推出数据更大的)推出后一种。

    我们设已经得到了n-1个数的总方法(1~n-1),然后根据这个我们要推出1~n的方法,

    于是我们考虑把新加入的一个数n枚举其插入位置,

    因为每插入一个数,它一定比前面的任何数都大(从小到大)

    如果插入到最左边,会造成新的序列比原来多一个大于号,如果插入到最右边,会造成新的序列比原来多一个小于号。

    (注意是这个数插入到符号的位置)

    如果插入到大于号的位置,删去一个大于号,多一个大于号一个小于号,也就是多一个小于号如果插入到小于号的位置,删去一个小于号,多一个大于号一个小于号,也就是多一个大于号

    所以,dp方程如下:(其中mod=2015)

    dp[i][j]=(dp[i-1][j]*(j+1)+dp[i-1][j-1]*(i-j))%mod;

    所以AC代码如下:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define mod 2015
    using namespace std;
    int n,k;
    int rqych[1002][1002];
    int read()
    {
        int ans=0;
        char ch=getchar(),last=' ';
        while(ch<'0'||ch>'9')last=ch,ch=getchar();
        while(ch>='0'&&ch<='9')ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
        return last=='-'?-ans:ans;
    }
    int main()
    {
        int i,j;
        n=read(),k=read();
        for(i=1;i<=n;i++) rqych[i][0]=rqych[i][i-1]=1;
        for(i=2;i<=n;i++) 
            for(j=1;j<=min(i-1,k);j++) rqych[i][j]=(rqych[i-1][j]*(j+1)+rqych[i-1][j-1]*(i-j))%mod;
        printf("%d",rqych[n][k]);
        return 0;
    }

    完结

    希望对大家有帮助

  • 相关阅读:
    OneNote 2010 文字识别
    Windows 7 添加网络共享打印机
    logstash
    filebeat
    记elk打包时的问题
    elasticsearch.yml
    zabbix 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作
    mac装brew
    snmp监控
    博科光纤交换机端口别名映射脚本
  • 原文地址:https://www.cnblogs.com/lbssxz/p/11166510.html
Copyright © 2020-2023  润新知