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 }

 

posted @ 2012-10-08 23:26  proverbs  阅读(207)  评论(0编辑  收藏  举报