• 单个整数:表示奶牛们可以获得的最大得分
样例输入 3 1 2 7 6 5 1 7 2 2 4 4 2 1 样例输出 17 提示 第一项比赛由第一头奶牛参加,第二项比赛 由第三头奶牛参加,第三项比赛由第二头奶牛参加 题解: n<=20 ->状压DP 然后定义F[i]表示i状态的奶牛,设now为i中1的数量,参加前now场比赛的最大得分 至于额外分这个东西,我把与比赛a有关的额外分都存在一个vector里 然后贪心 按pi从小到大排序 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 const int N=20; 8 struct node{ 9 int p,add;10 };11 vector<node>q[N+5];12 int s[N+5][N+5],F[1<<N];13 bool cmp(const node &p,const node &q){return p.p<q.p;}14 int getday(int x)15 {16 int cnt=0;17 while(x)18 {19 cnt++;20 x-=(x&(-x));21 }22 return cnt;23 }24 int main()25 {26 int n,m,x,y,z;27 scanf("%d%d",&n,&m);28 for(int i=1;i<=m;i++)29 {30 scanf("%d%d%d",&x,&y,&z);31 q[x].push_back((node){y,z});32 }33 for(int i=1;i<=n;i++)sort(q[i].begin(),q[i].end(),cmp);34 for(int i=1;i<=n;i++)35 for(int j=1;j<=n;j++)36 scanf("%d",&s[i][j]);37 int mk=(1<<n)-1,now,tmp;38 for(int i=0;i<mk;i++)39 {40 now=getday(i);41 for(int j=1;j<=n;j++)42 {43 if((1<<(j-1))&i)continue;44 tmp=F[i]+s[j][now+1];45 for(int k=0,sz=q[now+1].size();k<sz;k++)46 if(tmp>=q[now+1][k].p)tmp+=q[now+1][k].add;47 F[i|(1<<(j-1))]=max(F[i|(1<<(j-1))],tmp);48 }49 }50 printf("%d",F[mk]);51 return 0;52 }
转载于:https://www.cnblogs.com/Yuzao/p/7002489.html