20200720T4 五子棋

Description

WHU ACM的队员们迷上了五子棋游戏,他们决定组织一场队内友谊赛以便互相切磋棋艺。 比赛规则是这样的:每位选手都要和其他人进行一场比赛,每场比赛胜者将得到一定的积分,败者不得分,若和棋则双方都不得分。 每位队员都有一个经验值,我们可以认为比赛中经验值较高者获胜,若双方经验值相同则为和棋。 队员们都很聪明,他们会在比赛中不断进步。也就是说,和特定的对手进行比赛后,无论胜负,都会增加一定经验值。 小M作为WHU ACM集训队的队长有资格安排比赛顺序,而同时作为1号选手的他自然希望自己的积分能越高越好。因此,他请你根据相关信息写一个程序来帮助他。

Input

输入有多组数据,第一行为一个整数T(1 <= T <= 11),表示数据个数。 每组数据第一行为一个整数N(1 <= N <= 13)表示参赛选手数。 接下来有N行,每行包含N个范围为[0, 1000]的整数,第i 行的第j个数表示选手i与选手j比赛后选手i获得的经验值。 之后N行每行包含N个范围为[0, 10]的整数,第i行的第j个数表示选手i战胜选手j后得到的积分。 最后一行N个范围为[0, 1000]的整数,表示各位选手的初始经验值。

Output

输出T行(每行一个数),即小M能获得的最高积分。

Sample Input

2
2
0 1
1 0
0 1
1 0
1 1
3
0 5 2
0 0 0
0 0 0
0 10 1
1 0 1
1 0 0
1 10 5

Sample Output

0
1

solution

n<=13显然不是dfs暴力就是状压

首先因为1要赢得最多,所以他要先比完赛

因为只要有比赛就会加经验,别人互相比赛就会加经验,自己不变(就会被吊打

状压枚举状态即可

code

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<queue>
 7 #include<vector>
 8 #include<stack>
 9 #include<set>
10 #include<deque>
11 #include<map>
12 using namespace std;
13 
14 template <typename T> void read(T &x) {
15     x = 0; int f = 1; char c;
16     for (c = getchar(); c < '0' || c > '9'; c = getchar()) if (c == '-') f = -f;
17     for (; c >= '0' && c <= '9'; c = getchar()) x = 10 * x + c - '0' ;
18     x *= f;
19 }
20 template <typename T> void write(T x){
21     if (x < 0) putchar('-'), x = -x;
22     if (x > 9) write(x / 10);
23     putchar(x % 10 + '0');
24 }
25 template <typename T> void writeln(T x) { write(x); putchar('
'); }
26 template <typename T> void writesn(T x) { write(x); putchar(' '); }
27 
28 #define int long long
29 #define inf 1234567890
30 #define next net
31 #define P 1000000007
32 #define N 500020
33 #define mid ((l+r)>>1)
34 #define lson (o<<1)
35 #define rson (o<<1|1)
36 #define R register
37 
38 int t,n;
39 int a[20][20],b[20][20],c[20];
40 int f[N],jy[N];
41 int get(int x){
42     int ans=0;
43     for(R int i=2;x;x>>=1,i++)if(x&1)ans+=a[1][i];
44     return ans;
45 }
46 int calc(int x){
47     for(int i=2;x;x>>=1,i++)if(x&1)return i;
48 }
49 signed main(){
50     read(t);
51     while(t--){
52         memset(f,0,sizeof(f));
53         read(n);
54         for(R int i=1;i<=n;i++)
55             for(R int j=1;j<=n;j++)
56                 read(a[i][j]);
57         for(R int i=1;i<=n;i++)
58             for(R int j=1;j<=n;j++)
59                 read(b[i][j]);
60         for(R int i=1;i<=n;i++)read(c[i]);
61         for(R int i=0;i<=(1<<(n-1))-1;i++){
62             jy[i]=get(i)+c[1];
63             for(R int j=i;j;j-=(j&-j)){
64                 int x=i-(j&-j),y=calc(j);
65                 if(jy[x]>c[y])f[i]=max(f[i],f[x]+b[1][y]);
66             }
67         }
68         writeln(f[(1<<(n-1))-1]);
69     }
70     return 0;
71 }
原文地址:https://www.cnblogs.com/e-e-thinker/p/13348094.html