首页 > 学院 > 开发设计 > 正文

算法训练 未名湖边的烦恼

2019-11-11 01:22:43
字体:
来源:转载
供稿:网友
  算法训练 未名湖边的烦恼  时间限制: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/n",dp[m][n]);    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表