uva542 - France '98
说实话,这道题,我开始的时候都没看懂题意,,,
搜了篇解题报告也没看懂,,,
等我把网页上的粘下来一看,我明白了
1 Brazil -----+
+-- ? --+
2 Chile ------+ |
+-- ? --+
3 Nigeria ----+ | |
+-- ? --+ |
4 Denmark ----+ |
+-- ? --+
5 Holland ----+ | |
+-- ? --+ | |
6 Yugoslavia -+ | | |
+-- ? --+ |
7 Argentina --+ | |
+-- ? --+ |
8 England ----+ |
+-- World Champion
9 Italy ------+ |
+-- ? --+ |
10 Norway -----+ | |
+-- ? --+ |
11 France -----+ | | |
+-- ? --+ | |
12 Paraguay ---+ | |
+-- ? --+
13 Germany ----+ |
+-- ? --+ |
14 Mexico -----+ | |
+-- ? --+
15 Romania ----+ |
+-- ? --+
16 Croatia ----+
用的还是动规的记忆化搜索,晋级的规则很像二叉树的构造,把晋级图画出来差不多就懂了,(代码差不多是照抄的,,,)
代码如下:
#include <cstdio> double pp[16][16], f[16][5]; char c[16][20]; int mypow(int n) { int ans = 1; for(int i = 0; i < n; i++) ans*=2; return ans; } double fun(int x, int y) { if(y==0) return 1; double &ans = f[x][y]; if(ans) return ans; int mid = mypow(y-1); int len = mid*2; int a, b; if(x%len<mid) {a = (x/mid+1)*mid; b = (x/mid+2)*mid;} else {a = (x/mid-1)*mid; b = (x/mid)*mid; } for(int i = a; i < b; i++) ans += pp[x][i]*fun(i,y-1); return ans *= fun(x,y-1); } int main () { int tt; for(int i = 0; i < 16; i++) gets(c[i]); for(int i = 0; i < 16; i++) for(int j = 0; j < 16; j++) {scanf("%d",&tt); pp[i][j] = tt*1.0/100;} for(int i = 0; i < 16; i++) printf("%-10s p=%.2lf%c\n",c[i],fun(i,4)*100,'%'); return 0; }