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;
    }
  • 相关阅读:
    453. Minimum Moves to Equal Array Elements
    CDH的安装
    Java注解
    BeanUtils--内省加强
    Java内省
    ant工具
    log4j的配置及使用
    武汉科技大学ACM:1010: 零起点学算法89——母牛的故事
    武汉科技大学ACM:1009: 华科版C语言程序设计教程(第二版)例题5.4
    武汉科技大学ACM:1007: 不高兴的津津
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262797.html
Copyright © 2011-2022 走看看