记录编号 96700 评测结果 AAAAAAAAAA
题目名称 [USACO Feb14] 奶牛的十项全能 最终得分 100
用户昵称 GravatarMiku_lyt 是否通过 通过
代码语言 C++ 运行时间 0.845 s
提交时间 2014-04-14 15:53:14 内存使用 19.37 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>

using namespace std;

struct award{
  int k,p,a;
};

  award t[50];
  int s[50][50];
  int f[5000000];
  int n,m;

bool cmp1(const award x,const award y){
  return x.k<y.k;
}

int lowbit(int x){
  return x&(-x);
}

int count(int x){
  int sum=0;
  while (x){
    sum++;
    x-=lowbit(x);
  }
  return sum;
}

int award(int s,int x){
  int sum=0;
  for (int i=1;i<=m;i++){
    if (t[i].k>x){
      return sum;   
    }
    if (t[i].k==x){
      if (t[i].p<=s){
        sum+=t[i].a;
      }
    }
  }
  return sum;
}

int main(){
  freopen("deca.in","r",stdin);
  freopen("deca.out","w",stdout);
  
  scanf("%d%d",&n,&m);
  for (int i=1;i<=m;i++){
    scanf("%d%d%d",&t[i].k,&t[i].p,&t[i].a);
  }
  sort(t+1,t+m+1,cmp1);
  for (int i=1;i<=n;i++){
    for (int j=1;j<=n;j++){
      scanf("%d",&s[i][j]);
    }
  }
    
  int c=0;
  int now=0;
  for (int i=1;i<1 << n;i++){
    c=count(i);
    for (int j=0;j<n;j++){
      if ((i >> j)&1){
        now=(i|(1 << j))-(1 << j);
        f[i]=max(f[i],f[now]+s[j+1][c]);
      }
    }
    f[i]+=award(f[i],c);
  }
  
  printf("%d\n",f[(1 << n)-1]);
  return 0;
}