uva 1508(dp)

来源:互联网 发布:淘宝卖家怎么修改好评 编辑:程序博客网 时间:2024/05/28 16:21

题意:给出了n组数据,每组数据有5个数字,然后让挑出其中的k组,求k组中所有相应的数字最大的和。

题解:状态压缩,用00000表示未选出5个最大值,11111表示已经选出了5个最大值,那么情况就一共有32种,然后枚举每种情况更新f[i][j]数组,f[i][j]数组储存选i组情况是j的最大值之和是多少,结果就是f[k][31]。

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int N = 10005;int r[N][6], f[6][40], n, k;int main() {int t;scanf("%d", &t);while (t--) {scanf("%d%d", &n, &k);for (int i = 0; i < n; i++)for (int j = 0; j < 5; j++)scanf("%d", &r[i][j]);k = min(k, 5);memset(f, 0, sizeof(f));for (int i = 1; i <= k; i++)for (int j = 0; j < 32; j++)for (int sta = j; sta; sta = (sta - 1) & j) {int temp = j - sta;for (int l = 0; l < n; l++) {int sum = 0;for (int m = 0; m < 5; m++)if (sta & (1 << m))sum += r[l][m];f[i][j] = max(f[i][j], f[i - 1][temp] + sum);}}printf("%d\n", f[k][31]);}return 0;}


0 0
原创粉丝点击