zoukankan      html  css  js  c++  java
  • 算法训练 未名湖边的烦恼

      算法训练 未名湖边的烦恼  
    时间限制:1.0s   内存限制:256.0MB
       
    问题描述
      每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
      每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
    输入格式
      两个整数,表示m和n
    输出格式
      一个整数,表示队伍的排法的方案数。
    样例输入
    3 2
    样例输出
    5
    数据规模和约定
      m,n∈[0,18]
      问题分析


    思路:

    没有感觉特别大的障碍,读题费了点功夫。要注意一句话:(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)

    可以理解为只有m人还鞋,没有人租鞋的时候,无论这m个人怎么排列都只看作一种方案

    递推方程很好写:dp[i][j]=dp[i-1][j]+dp[i][j-1],还鞋或者租鞋的人减少一个状态相加得来

    代码:

    #include<iostream>
    #include<string>
    #include<cstring>
    using namespace std;
    const int MAXN=19;
    int dp[MAXN][MAXN];
    void init()
    {
        memset(dp,0,sizeof(dp));
        for(int i=0;i<MAXN;i++)
            dp[i][0]=1;//(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)所以不用求阶乘了+_+,想的有点多
        for(int i=1;i<MAXN;i++)
        {
            for(int j=1;j<MAXN;j++)
            {
                if(i>=j)
                    dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        }
    }
    int main()
    {
        init();
        int m,n;
        scanf("%d%d",&m,&n);
        printf("%d
    ",dp[m][n]);
        return 0;
    }
    


  • 相关阅读:
    【足迹C++primer】32、定制操作_2
    pom文件miss artifact com.sun:tools:jar:1.5.0:system问题
    cents上运行wget报错:unable to resolve host address
    怎样定义函数模板
    06006_redis数据存储类型——String
    雷林鹏分享:C# 类型转换
    雷林鹏分享:C# 运算符
    雷林鹏分享:C# 循环
    雷林鹏分享:C# 判断
    雷林鹏分享:C# 方法
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/7776031.html
Copyright © 2011-2022 走看看