zoukankan      html  css  js  c++  java
  • 牛客练习赛71 数学考试 题解(dp)

    题目链接

    题目大意

    要你求出有多少个长度为n的排列满足m个限制条件

    第i个限制条件 p[i]表示前 p[i]个数不能是1-p[i]的排列

    题目思路

    这个感觉是dp但是不知道怎么dp

    首先就是要明白如果不满足1-p[i]为全排列,那么前p[i]个数必定有大于p[i]的数

    那么就可以设(dp[i][j]为前i个数中最大值为j的个数)

    最后的答案就是(dp[n][n])

    他这个的限制条件其实就是使得(dp[p[i]][p[i]]=0)

    代码

    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<unordered_map>
    #define fi first
    #define se second
    #define debug printf(" I am here
    ");
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    const int maxn=2e3+5,inf=0x3f3f3f3f,mod=20000311;
    const double eps=1e-10;
    int n,m,p[maxn];
    ll pre[maxn],dp[maxn][maxn];
    signed main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            scanf("%d",&p[i]);
        }
        memset(dp,-1 ,sizeof(dp));
        for(int i=1;i<=n;i++){
            dp[1][i]=1;
        }
        for(int i=1;i<=m;i++){
            dp[p[i]][p[i]]=0;
        }
        for(int i=1;i<=n;i++){
            pre[i]=pre[i-1]+dp[1][i];
        }
        for(int i=2;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(dp[i][j]==0) continue;
                if(i>j){
                    dp[i][j]=0;
                }else{
                    dp[i][j]=(dp[i-1][j]*(j-i+1)+ pre[j-1]-pre[0])%mod;
                }
            }
            for(int j=1;j<=n;j++){
                pre[j]=(pre[j-1]+dp[i][j])%mod;
            }
        }
        printf("%lld
    ",(dp[n][n]%mod+mod)%mod);
        return 0;
    }
    
    
    卷也卷不过,躺又躺不平
  • 相关阅读:
    git将已存在的项目转换成git项目&托管git服务器
    联合索引
    MyISAM和InnoDb的关系
    NPOIHelper
    C# CRC各种转换
    appcloud 微信分享大图片
    C# 微信JSSDK 获取配置信息
    简易delegate委托
    GPS、谷歌、百度、高德坐标相互转换
    反射执行方法WINFROM
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/13790051.html
Copyright © 2011-2022 走看看