• poj3934Queue(dp)


    题目链接:

    啊哈哈,点我点我

    题意:

    有n个幼儿园的孩纸。然后从中找出m对孩子可以让他们看到两方,这样以便他们交流。。

    思路:

    首先能够考虑把n-1个人已经排成了m-2对。那么仅仅须要把这个最矮的随便插在队伍就能够凑成m对了。第二种情况是先排成m-1对。然后把最矮的那一个放在对首或者队尾。这样就到了状态转移方程。

    if(j>=2)

    dp[i][j]=dp[i-1][j-2]*(i-2)

    if(j>=1)

    dp[i][j]=dp[i][j]+dp[i-1][j-1]*2;

    然后最開始把1个人2个人的全部状态枚举出来。。

    然后对题目中给的范围进行预处理得到全部解。然后直接询问就可以。问题就得到了完美的解决。

    题目:

    Queue
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 406   Accepted: 179

    Description

    Linda is a teacher in ACM kindergarten. She is in charge of n kids. Because the dinning hall is a little bit far away from the classroom, those n kids have to walk in line to the dinning hall every day. When they are walking in line, if and only if two kids can see each other, they will talk to each other. Two kids can see each other if and only if all kids between them are shorter then both of them, or there are no kids between them. Kids do not only look forward, they may look back and talk to kids behind them. Linda don’t want them to talk too much (for it’s not safe), but she also don’t want them to be too quiet(for it’s boring), so Linda decides that she must form a line in which there are exactly m pairs of kids who can see each other. Linda wants to know, in how many different ways can she form such a line. Can you help her?

     

    Note: All kids are different in height.

    Input

    Input consists of multiple test cases. Each test case is one line containing two integers. The first integer is n, and the second one is m. (0 < n <= 80, 0 <= m <= 10000). 
    Input ends by a line containing two zeros.

    Output

    For each test case, output one line containing the reminder of the number of ways divided by 9937. 

    Sample Input

    1 0
    2 0
    3 2
    0 0

    Sample Output

    1
    0
    4

    Source


    代码为:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define mod 9937
    using namespace std;
    
    int dp[80+10][10000+10];
    
    void init()
    {
        memset(dp,0,sizeof(dp));
        dp[1][0]=1;
        dp[2][1]=2;
        for(int i=3;i<=81;i++)
            for(int j=1;j<=10001;j++)
        {
            if(j>=2)  dp[i][j]=(dp[i-1][j-2]*(i-2))%mod;
            if(j>=1)  dp[i][j]=(dp[i][j]+dp[i-1][j-1]*2)%mod;
        }
    }
    
    int main()
    {
        int n,m;
        init();
        while(~scanf("%d%d",&n,&m))
        {
            if(n==0&&m==0)  return 0;
            cout<<dp[n][m]<<endl;
        }
        return 0;
    }



  • 相关阅读:
    shell脚本,通过传入的参数来计算最大值和最小值以及平均值。
    mac date命令
    jstorm系列-2:入门
    jstorm系列-1:入门
    git 如何恢复只是提交到本地的文件(或者commit)
    shell 参数
    shell 运算符
    shell 中的<,<<,>,>>
    shell 学习笔记
    java 多线程剖析
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5221142.html
Copyright © 2020-2023  润新知