• 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 }
  • 相关阅读:
    javascript Location对象属性和方法
    javascript History对象属性和方法
    javascript Navigator对象属性和方法
    JavaScript数组去重
    npm命令概述
    git的基本操作
    nodejs环境使用jshint
    基于GitLab CI、Docker的Node.js持续集成部署方案
    页面重构中的语义化(转自鬼哥)
    nodejs安装
  • 原文地址:https://www.cnblogs.com/e-e-thinker/p/13348094.html
Copyright © 2020-2023  润新知