zoukankan      html  css  js  c++  java
  • 解题报告:luogu P2401 不等数列

    还是很菜,只能做绿题。
    而且 whk 异常颓废,明天要给自己定任务了。。。
    没带学读了
    题目链接:P2401 不等数列
    考虑 (dp)
    如何继承呢?
    我们来手玩一下吧,看 (n=3) 是的一种种 (k=1) 的情况:

    [3>1<2 ]

    我们发现可以在四个位置插入 (4)
    显然插到最前面不增加贡献,然而插到最后面一定产生贡献。
    所以就不讨论了。
    然后我们发现如果 (4) 插到 (>) 处就会成:(<4>)
    显然产生一个贡献,然后看插到 (<) 处:(<4>)
    没有贡献。
    唉,怎么状态都一样啊一样啊
    那么显然可以推出式子:
    (dp_{i,j}) 为前 (n) 个数有 (j)(<) 时的方案数,那么:

    [dp_{i,j}=(j+1)dp_{i-1,j}+(i-j)dp_{i-1,j-1} ]

    注意向两边放的情况,不要落下。
    边界值很简单:

    [dp_{i,0}=1,dp_{i,{i-1}}=1 ]

    当然还有特判一些无脑的点,比如 (dp_{i,i}=0)

    (Code):

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    
    #define read(x) scanf("%d",&x)
    #define MOD 2015
    
    int dp[1005][1005];
    int n,k;
    
    int main()
    {
    	read(n),read(k);
    	if(n==1){printf("0
    ");return 0;}
    	if(n==k){printf("0
    ");return 0;}
    	if(k==n-1){printf("1
    ");return 0;}
    	for(int i=2;i<=n;i++) dp[i][0]=dp[i][i-1]=1;
    	for(int i=2;i<=n;i++)
    	{
    		for(int j=1;j<=i-2;j++)
    		{
    			dp[i][j]=((j+1)*dp[i-1][j]%MOD+(i-j)*dp[i-1][j-1]%MOD)%MOD;
    		}
    	}
    	printf("%d
    ",dp[n][k]%MOD);
    	return 0;
    }
    
  • 相关阅读:
    用dockerFile和docker build命令 创建带两个数据卷的新镜像
    Docker 学习 3 镜像更多命令 docker commit 提交容器副本,使之成为一个新的镜像
    Docker学习笔记 2 更多的容器命令
    Docker的学习1 安装 与 基础篇
    SeekBar(拖动条)
    本周总结
    ProgressBar(进度条)
    Android对话框
    css语法
    css基础
  • 原文地址:https://www.cnblogs.com/tlx-blog/p/12790938.html
Copyright © 2011-2022 走看看