Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- int n;
- double value[20][20];
- double max(double a,double b){
- return (a > b ? a : b);
- }
- /*
- double cal(int order,int check){
- if(check == (1<<n)-1){
- return 1;
- }
- double ans = 0;
- for(int i = 0 ; i < n ; i ++){
- if((check & (1<<i)) == 0){ //and use
- ans = max(ans,cal(order+1,(check | (1<<i)))*(value[i][order]/100) );
- }
- }
- return ans;
- }
- */
- int main()
- {
- // for(int i = 0 ; i < 20 ; i ++)for(int j = 0 ; j < (1<<20) ; j ++)dp[i][j] = -1;
- scanf("%d",&n);
- for(int i = 0 ; i < n ; i ++){
- for(int j = 0 ; j < n ; j ++){
- scanf("%lf",&value[i][j]);
- }
- }
- // printf("%lf",100*cal(0,0));
- double dp[2][1<<n];
- // for(int i = 0 ; i < (1<<n) ; i ++)dp[n%2][i] = 1;
- for(int order = n-1 ; order >= 0 ; order -- ){
- for(int check = (1<<n)-1 ; check >= 0 ; check --){
- if(check == (1<<n)-1 || order == n){
- dp[order%2][check] = 1;
- continue;
- }
- double ans = 0;
- for(int i = 0 ; i < n ; i ++){
- if((check & (1<<i)) == 0){ //and use
- double d;
- if(order+1 == n){
- d = 1;
- }
- else{
- d = dp[(order+1)%2][(check | (1<<i))];
- }
- ans = max(ans,d * (value[i][order]/100));
- }
- }
- // printf("%.2lf ",ans);
- dp[order%2][check] = ans;
- }
- // printf("\n");
- }
- printf("%lf",dp[0][0]*100);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement