【HDU 2512】【这是DP吗?】一卡通大冒险

要说的都在注释里面。。。

因为长期钻研微积分, 麻神至今单身,某天,麻神想到了一个方法,把自己的联系方式写在学生卡的背面,然后故意将自己的卡"遗失"在某处(如水房,LS,NB ,SB ,食堂。。。。)他们希望能有MM看到他们遗失卡,能主动跟他们联系,这样就有机会请MM吃饭了。他将自己的学生卡夹在基本相同的书里,然后再将书遗失到校园的各个角落。当他为自己的至少啧啧赞叹时,发一个问题,很明显,如果只有一张校园卡,那么只有一种方法,即,将其夹入一本书中。当有两张校园卡时,就有了两种选择,即,将两张校园卡夹在一本书里,或者分开夹在不同的书里。当有三张校园卡时,他就有了5种选择,即:

{{A},{B},{C}} , {{A,B},{C}}, {{B,C},{A}}, {{A,C},{B}} ,{{A,B,C}} 于是,麻神希望了解,如果浪哥实验室对里有n位单身狗(即有N张学生卡),那么要把这些学生卡夹到书里有多少种不同的方法。


#include "stdio.h"
#include "string.h"
//选修课的时候自己脑补递归写法的时候还为自己机制啧啧赞叹
//结果。。。自己试了个数字就直接半天出不了结果,这个故事告诉我们,打表才是王道。
int dp[2010][2010];
int ans[2010];
void f();
int main()
{
  memset(dp,0,sizeof(dp));
  memset(ans,0,sizeof(ans));
  f();//感觉今天是智障了,这样子调用函数。。。viod f()。。。呵呵呵呵呵呵
  int n,t;
  scanf("%d",&t);
  while(t--)
  {
    scanf("%d",&n);
    printf("%d\n",ans[n]%1000);
  }
  return 0;
}
void f()
{
  ans[0]=1;
  dp[0][0]=1;
  for(int i=1;i<=2000;i++)
    for(int j=0;j<=i;j++)
      {
        dp[i][j]=(dp[i-1][j]*j+dp[i-1][j-1])%1000;
        ans[i]+=dp[i][j];
      } 
}


你可能感兴趣的:(c,动态规划)