比赛 20140414 评测结果 AAAAAAAAAA
题目名称 奶牛的十项全能 最终得分 100
用户昵称 cstdio 运行时间 0.693 s
代码语言 C++ 内存使用 4.32 MiB
提交时间 2014-04-14 09:45:30
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<deque>
using namespace std;
const int SIZEN=25;
int getdig(int x,int k){return (x>>(k-1))&1;}
int changedig(int x,int k,int t){
	x&=(~(1<<(k-1)));
	return x|(t<<(k-1));
}
vector<pair<int,int> > reward[SIZEN];
int S[SIZEN][SIZEN]={0};
int N,B;
int lowbit(int x){
	return x&(-x);
}
int popcount(int x){
	int ans=0;
	while(x) ans++,x-=lowbit(x);
	return ans;
}
int F[1<<20]={0};
void work(void){
	for(int i=1;i<(1<<N);i++){
		int pos=popcount(i);
		for(int j=1;j<=N;j++){
			if(getdig(i,j)){
				F[i]=max(F[i],F[changedig(i,j,0)]+S[j][pos]);
			}
		}
		int temp=0;
		for(int j=0;j<reward[pos].size();j++){
			if(F[i]>=reward[pos][j].first) temp+=reward[pos][j].second;
		}
		F[i]+=temp;
	}
	printf("%d\n",F[(1<<N)-1]);
}
void read(void){
	scanf("%d%d",&N,&B);
	int k,p,a;
	for(int i=1;i<=B;i++){
		scanf("%d%d%d",&k,&p,&a);
		reward[k].push_back(make_pair(p,a));
	}
	for(int i=1;i<=N;i++) sort(reward[i].begin(),reward[i].end());
	for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) scanf("%d",&S[i][j]);
}
int main(){
	freopen("deca.in","r",stdin);
	freopen("deca.out","w",stdout);
	read();
	work();
	return 0;
}