zoukankan      html  css  js  c++  java
  • 打表找规律C

    题目链接:https://cn.vjudge.net/contest/273377#problem/C

    给你 n,m,k.

    这个题的意思是给你n个数,在对前m项的基础上排序的情况下,问你满足递增子序列的长度至少为n-1的排列组合的个数。

    具体方法:打表找规律。

    打表代码:

    #include<bits/stdc++.h>
    #include<string>
    #include<cstring>
    #include<stdio.h>
    using namespace std;
    # define ll long long
    # define inf 0x3f3f3f3f
    const int maxn =1000;
    int a[maxn];
    int vis[maxn];
    int ww[maxn][maxn];
    int b[maxn];
    bool judge(int t,int w)
    {
        for(int i=1; i<=t; i++)
        {
            b[i]=a[i];
        }
        sort(b+1,b+w+1);
        memset(vis,0,sizeof(vis));
        int ans=0;
        int temp;
        for(int i=t; i>=1; i--)
        {
            temp=1;
            int maxx=0;
            for(int j=i; j<=t; j++)
            {
                if(b[j]>b[i])
                {
                    maxx=max(maxx,vis[j]);
                }
            }
            vis[i]=maxx+1;
        }
        for(int i=1; i<=t; i++)
        {
            if(vis[i]>=t-1)return true;
        }
        return false;
    }
    int main()
    {
        int t=10;
        while(1)
        {
            if(t==0)break;
            for(int i=1; i<=t; i++)
            {
                a[i]=i;
            }
            do
            {
                // cout<<t<<endl;
                for(int i=1; i<=t; i++)
                {
                    if(judge(t,i))
                    {
                        ww[t][i]++;
                    }
                }
    //        for(int i=0;i<t;i++)
    //        cout<<a[i]<<" ";
    //        cout<<endl;
            } while(next_permutation(a+1,a+t+1));
            t--;
        }
        for(int i=1; i<=10; i++)
        {
    
            for(int j=1; j<=i; j++)
            {
                cout<<ww[i][j]<<" ";
            }
            cout<<endl;
        }
        return 0;
        }
    /*
    
    1 
    2 2 
    5 6 6 
    10 14 24 24 
    17 26 54 120 120 
    26 42 96 264 720 720 
    37 62 150 456 1560 5040 5040 
    50 86 216 696 2640 10800 40320 40320 
    65 114 294 984 3960 18000 85680 362880 362880 
    82 146 384 1320 5520 26640 141120 766080 3628800 3628800 
    */
    
    
    

    AC代码:

    #include<bits/stdc++.h>
    #include<string>
    #include<cstring>
    #include<stdio.h>
    using namespace std;
    # define ll long long
    # define inf 0x3f3f3f3f
    const int maxn =60;
    ll dp[maxn][maxn];
    ll a[maxn];
    ll n,m,k;
    void init()
    {
        a[1]=2;
        for(int i=2; i<=50; i++)
        {
            a[i]=(a[i-1]*i)%k;
        }
        dp[1][1]=1;
        if(m>n)m=n;
        for(int i=2; i<=50; i++)
        {
            dp[i][i]=dp[i][i-1]=(dp[i-1][i-1]*i)%k;
        }
        for(int i=m+2; i<=50; i++)
        {
            dp[i][m]=(dp[i-1][m]*2-dp[i-2][m]+a[m]+k)%k;//这里需要加k,因为有可能出现负值
        }
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        int Case=0;
        while(T--)
        {
            scanf("%lld%lld%lld",&n,&m,&k);
            init();
            printf("Case #%d: ",++Case);
            printf("%lld
    ",dp[n][m]);
        }
        return 0;
    }
  • 相关阅读:
    问题总结
    Https网络安全架构设计
    分布式ID生成策略
    [转]匿名内部类详解
    JAVA名词解释
    MQ实战
    手写SpringMVC实现
    多线程问答
    BIO、NIO实战
    spring中@Value("${key}")值原样输出${key}分析与解决
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262797.html
Copyright © 2011-2022 走看看