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('\n'); } 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 }