http://acm.hdu.edu.cn/showproblem.php?pid=2291
读题读的烦死了,今天果真不适合做题
题意:给两个n*n的矩阵,第一个代表一个人战胜一个人可以得到的经验值,第二个代表一个人战胜另一个人可以得到的分数,然后n个数,代表n个人的初始经验值,只有经验值大于对手才可以取胜,问第一个人最后取得的最大分数
n只有13,状压dp随便搞一下
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std ; int dp[<<];
int e[],r[],s[],n; int exp(int x){
int st=;
int res=s[];
for(int i=;i<n-;i++){
if((x>>i)&){
res+=e[st];
}
st++;
}
return res;
} int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=;i<n*n;i++)
scanf("%d",&e[i]);
for(int i=;i<n*n;i++)
scanf("%d",&r[i]);
for(int i=;i<n;i++)
scanf("%d",&s[i]);
memset(dp,,sizeof(dp));
for(int i=;i<(<<(n-));i++){
for(int j=;j<n-;j++){
if(i&(<<j)){
if(exp(i^(<<j))>s[j+]){
dp[i]=max(dp[i],dp[i^(<<j)]+r[j+]);
}
}
}
}
printf("%d\n",dp[(<<(n-))-]);
}
return ;
}