POJ 1189 模拟/DP

没什么好说的,照着题目模拟就好~

(别告诉我你不知道这个是中文题)

 

View Code
 1 #include <cstdio>

 2 #include <cstring>

 3 #include <cstdlib>

 4 #include <iostream>

 5 

 6 #define N 60

 7 

 8 using namespace std;

 9 

10 int n,m,num;

11 bool tra[N*N];

12 long long fz,fm,ubt,dp[N][N];

13 

14 long long gcd(long long a,long long b)

15 {

16     long long mod;

17     while(b)

18     {

19         mod=a%b;

20         a=b; b=mod;

21         //cout<<a<<"   "<<b<<endl;

22     }

23     return a;

24 }

25 

26 void go()

27 {

28     num=0;

29     char str[4];

30     for(int i=1;i<=n;i++)

31         for(int j=1;j<=i;j++)

32         {

33             scanf("%s",str);

34             if(str[0]=='*') tra[++num]=true;

35             else tra[++num]=false;

36         }    

37     //for(int i=1;i<=num;i++) printf("%d    %d\n",i,tra[i]);

38     

39     memset(dp,0,sizeof dp);

40     dp[1][1]=1LL<<n;

41     for(int i=1,sbh;i<=n;i++)

42     {

43         sbh=(i*(i-1))/2;

44         for(int j=1;j<=i;j++)

45         {

46             if(tra[j+sbh])

47             {

48                 dp[i+1][j]+=dp[i][j]/2;

49                 dp[i+1][j+1]+=dp[i][j]/2;

50             }

51             else dp[i+2][j+1]+=dp[i][j];

52         }

53     }

54     

55     fz=dp[n+1][m+1];

56     fm=1LL<<n;

57     

58 

59     ubt=gcd(fm,fz);

60     if(fz==0) fm=ubt=1;

61     printf("%lld/%lld\n",fz/ubt,fm/ubt);

62 }

63 

64 int main()

65 {

66     while(scanf("%d%d",&n,&m)!=EOF)

67     {

68         go();

69     }

70     return 0;

71 }

 

你可能感兴趣的:(poj)