zoukankan      html  css  js  c++  java
  • 洛谷 P2401 不等数列 题解

    每日一题 day25 打卡

    Analysis

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

    其中i和j是表示前i个数中有j个小于号,j<=i-1

    要在长度为i的数列中插入一个数,那么共有i+1个位置可以插入(第一个位置最后一个位置和中间的i-1个位置)。由于插入的数字大于之前所有数,那么在原串中是小于号的位置插入这个数会多出来一个大于号,小于号数量则不变,如果在大于号位置插入会多一个小于号,而插在头位置也多一个大于,末位置多一个小于,总计,使小于号数量不变的位置有(j+1)个,剩下的(i-j)个位置会使小于号数量增加、

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define int long long
     6 #define maxn 1000+10
     7 #define mod 2015
     8 using namespace std;
     9 inline int read() 
    10 {
    11     int x=0;
    12     bool f=1;
    13     char c=getchar();
    14     for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
    15     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
    16     if(f) return x;
    17     return 0-x;
    18 }
    19 inline void write(int x)
    20 {
    21     if(x<0){putchar('-');x=-x;}
    22     if(x>9)write(x/10);
    23     putchar(x%10+'0');
    24 }
    25 int n,k;
    26 int dp[maxn][maxn];
    27 signed main()
    28 {
    29     n=read();k=read();
    30     dp[1][0]=1;
    31     for(int i=2;i<=n;i++)
    32     {
    33         dp[i][0]=1;
    34         for(int j=1;j<=k;j++)
    35         {
    36             dp[i][j]+=(dp[i-1][j]*(j+1))%mod;
    37             dp[i][j]+=(dp[i-1][j-1]*(i-j))%mod;
    38             dp[i][j]%=mod;
    39         }
    40     }
    41     write(dp[n][k]);
    42     return 0;
    43 }

    请各位大佬斧正(反正我不认识斧正是什么意思)

  • 相关阅读:
    C++逐行读取文本文件的正确做法
    <Android Framework 之路>Android5.1 Camera Framework(一)
    zeromq-4.1.2在windows下的编译
    Duilib应用修改程序图标方法
    gdal集成kml库的做法
    使用DWR实现JS调用服务端Java代码
    DirectUI界面编程(六)实现右键弹出菜单
    如何设计系统的错误码及错误信息
    TCP协议格式
    UDP协议
  • 原文地址:https://www.cnblogs.com/handsome-zyc/p/11637611.html
Copyright © 2011-2022 走看看