题意: n和人做m道题, 每俩人做的题数不能相差一题以上.(也就是每n道题分别由n个人完成) 给n个人分别做m道题的概率, 求完成m题的最大期望
$1le N le 10$
注意!!! fill dp 的地方! [0, m] 所以要 m+1 !!
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <climits> 5 #include <cctype> 6 #include <cmath> 7 #include <string> 8 #include <sstream> 9 #include <iostream> 10 #include <algorithm> 11 #include <iomanip> 12 using namespace std; 13 #include <queue> 14 #include <stack> 15 #include <vector> 16 #include <deque> 17 #include <set> 18 #include <map> 19 typedef long long LL; 20 typedef long double LD; 21 #define pi acos(-1.0) 22 #define lson l, m, rt<<1 23 #define rson m+1, r, rt<<1|1 24 typedef pair<int, int> PI; 25 typedef pair<int, PI> PP; 26 #ifdef _WIN32 27 #define LLD "%I64d" 28 #else 29 #define LLD "%lld" 30 #endif 31 //#pragma comment(linker, "/STACK:1024000000,1024000000") 32 //LL quick(LL a, LL b){LL ans=1;while(b){if(b & 1)ans*=a;a=a*a;b>>=1;}return ans;} 33 //inline int read(){char ch=' ';int ans=0;while(ch<'0' || ch>'9')ch=getchar();while(ch<='9' && ch>='0'){ans=ans*10+ch-'0';ch=getchar();}return ans;} 34 //inline void print(LL x){printf(LLD, x);puts("");} 35 //inline void read(int &x){char c = getchar();while(c < '0') c = getchar();x = c - '0'; c = getchar();while(c >= '0'){x = x * 10 + (c - '0'); c = getchar();}} 36 37 double mp[15][1005]; 38 double dp[1<<10][1005]; 39 int main() 40 { 41 #ifndef ONLINE_JUDGE 42 freopen("in.txt", "r", stdin); 43 freopen("out.txt", "w", stdout); 44 #endif 45 int t, ca=1; 46 scanf("%d", &t); 47 while(t--) 48 { 49 int n, m; 50 scanf("%d%d", &n, &m); 51 for(int i=0;i<n;i++) 52 for(int j=0;j<m;j++) 53 scanf("%lf", &mp[i][j]); 54 printf("Case #%d: ", ca++); 55 for(int i=0;i<(1<<n);i++) 56 fill(dp[i], dp[i]+m+1, -1); 57 // memset(dp, -1, sizeof(dp)); 58 dp[0][0]=0; 59 for(int i=0;i<m;i++) 60 for(int s=0;s<(1<<n);s++) 61 { 62 if(dp[s][i]<0) 63 continue ; 64 for(int j=0;j<n;j++) 65 if(!((1<<j) & s)) // 第j个人没做 66 if(((1<<j) | s)==((1<<n)-1)) // n个人 都做了 则清空 进行下一轮 67 dp[0][i+1]=max(dp[0][i+1], dp[s][i]+mp[j][i]); 68 else 69 dp[(1<<j) | s][i+1]=max(dp[(1<<j) | s][i+1], dp[s][i]+mp[j][i]); 70 } 71 double ans=0; 72 for(int i=0;i<=(1<<n)-1;i++) 73 ans=max(ans, dp[i][m]); 74 printf("%.5lf ", ans); 75 } 76 return 0; 77 }