您的位置:首页 > 其它

vijos1426 兴奋剂检查 - 动态规划

2017-05-26 21:45 281 查看
传送门

题目大意:略。

题解:把五位状态用类似进制位的思想压缩成一位即可,注意细节。

代码://vijos 1426
#include<iostream>
#include<cstring>
#include<cstdio>
#define up upppppuuup
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define per(i,t,s) for(int i=t;i>=s;i--)
#define MAXN 5100000
using namespace std;
int up[10],v[210][10],w[210],dp[MAXN];
int calc(int a,int b,int c,int d,int e)
{
return a*(up[2]+1)*(up[3]+1)*(up[4]+1)*(up[5]+1)
+b*(up[3]+1)*(up[4]+1)*(up[5]+1)
+c*(up[4]+1)*(up[5]+1)+d*(up[5]+1)+e;
}
int main()
{
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d",&up[i]);
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
for(int j=1;j<=m;j++)
scanf("%d",&v[i][j]);
}
rep(i,1,n)per(a,up[1],v[i][1])per(b,up[2],v[i][2])
per(c,up[3],v[i][3])per(d,up[4],v[i][4])per(e,up[5],v[i][5])
{
int x=calc(a,b,c,d,e),y=calc(a-v[i][1],b-v[i][2],c-v[i][3],d-v[i][4],e-v[i][5]);
dp[x]=max(dp[x],dp[y]+w[i]);
}
printf("%lld\n",dp[calc(up[1],up[2],up[3],up[4],up[5])]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: