您的位置:首页 > 产品设计 > UI/UE

LA 5842 Equipment (状态压缩+dp)

2013-02-22 23:17 246 查看
ACM-ICPC Live Archive

  根据题意,因为最多只有五种属性,所以可以通过其中几种属性是否确定了来进行DP。

  有这个想法是因为整体的最大值是由某个物品的其中某些属性来确定的,dp的时候可以独立的求出那些确定了的属性的值,通过不断更新,最后找到整体的最大值。

  复杂度是O(k*3^k*n),当k大于5的时候,跟等于5的时候是一样的,所以k=min(k, 5)。

代码如下:

View Code

#define REP(i, n) for (int i = 0; i < (n); i++)
#define REP_1(i, n) for (int i = 1; i <= (n); i++)

int dp
[M], rec[LEN][N - 1];

int work(int n, int m) {
m = min(m, 5);
REP_1(i, m) {
REP(j, M) {
for (int t = j; t; t = (t - 1) & j) {
int op = j - t;
REP(k, n) {
int sum = 0;
REP(p, 5) {
if (t & (1 << p)) sum += rec[k][p];
}
dp[i][j] = max(dp[i][j], dp[i - 1][op] + sum);
}
}
}
}
return dp[m][M - 1];
}

int main() {
int n, m, T;
scanf("%d", &T);
while (T-- && ~scanf("%d%d", &n, &m)) {
_clr(rec);
_clr(dp);
REP(i, n) REP(j, 5) scanf("%d", &rec[i][j]);
printf("%d\n", work(n, m));
}
return 0;
}


——written by Lyon
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: