第一题,神题不可做。
第二题,傻逼题裸裸的转移。。显而易见。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 double a[20][20]; 6 double dp[2000010]; 7 int main() 8 { 9 // freopen("b.in","r",stdin); 10 // freopen("b.out","w",stdout); 11 int N; 12 scanf("%d",&N); 13 for(int i=1;i<=N;i++) 14 for(int j=1;j<=N;j++) 15 scanf("%lf",&a[i][j]); 16 for(int i=1;i<(1<<N);i++) 17 dp[i]=0.0; 18 dp[0]=1.0; 19 for(int i=0;i<=(1<<N);i++) 20 { 21 int cnt=N,x=i; 22 while(x) 23 { 24 cnt--; 25 x=x&(x-1); 26 } 27 for(int j=0;j<N;j++) 28 if(!(i&(1<<j))) 29 for(int k=0;k<N;k++) 30 if(!(i&(1<<k))) 31 if(j!=k) 32 { 33 dp[i|(1<<j)]+=dp[i]*(double)2/((double)(cnt-1)*(cnt))*(a[k+1][j+1]); 34 } 35 } 36 int T=(1<<N)-1; 37 for(int i=0;i<N;i++) 38 printf("%.5lf\n",dp[T-(1<<i)]); 39 }
第三题,用01串表示最大fibonacci数来表示,然后dp转移,当场考试我就差了一点,一种比较特殊的情况,导致我直接WA10,←_←。。。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #ifdef WIN32 6 #define LL "%I64d" 7 #else 8 #define LL "%lld" 9 #endif 10 long long b[110],T; 11 bool c[110],d[110]; 12 long long x[110]; 13 long long dp[110][2]; 14 int main() 15 { 16 // freopen("c.in","r",stdin); 17 // freopen("c.out","w",stdout); 18 b[1]=1; 19 b[2]=2; 20 for(int i=3;i<=91;i++) 21 { 22 b[i]=b[i-1]+b[i-2]; 23 } 24 scanf(LL,&T); 25 long long a; 26 while(T--) 27 { 28 scanf(LL,&a); 29 int maxx=0; 30 long long ans=1; 31 memset(c,0,sizeof(c)); 32 memset(d,0,sizeof(d)); 33 if(a<=0) 34 { 35 cout<<"0"<<endl; 36 continue; 37 } 38 for(int i=91;i>=1;i--) 39 { 40 if(a>=b[i]) 41 maxx=max(maxx,i),d[i]=c[i]=true,a-=b[i]; 42 } 43 long long cnt=0; 44 long long nn=0; 45 for(int i=1;i<=maxx;i++) 46 { 47 if(!d[i]) 48 cnt++; 49 else 50 { 51 x[++nn]=cnt; 52 cnt=0; 53 } 54 } 55 dp[0][0]=1; 56 dp[0][1]=0; 57 for(int i=1;i<=nn+1;i++) 58 { 59 dp[i][0]=dp[i-1][0]+dp[i-1][1]; 60 dp[i][1]=dp[i-1][0]*(x[i]/2)+dp[i-1][1]*((x[i]+1)/2); 61 } 62 printf(LL "\n",dp[nn+1][0]); 63 } 64 return 0; 65 }