ZOJ - 3471   Most Powerful

************************************

*原来这名叫 mask dp ~~~

*递推思想:

*要求求出所有的atom碰撞所产生的能量的最大和。

*设总的集合为S,假设最优解的第一次碰撞少一个原子X。那么我们必须保证剩下的

*S-{X}所产生的能量是最大的。

*由于满足最优子结构,可以从一个小的子集开始,一直递推到最大的集合。

*************************************

#include <cstdio>

#include <algorithm>
#define max(a, b) (a > b ? a: b)
using namespace std;
 
const int bin[11] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024};
int f[11][11];
int dp[1024];
int main() {
int n;
while(scanf("%d", &n) != EOF && n > 0) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
scanf("%d", &f[i][j]);
}
}
fill(dp, dp+bin[n], 0);
for(int k = 0; k < bin[n]; k++) {
for(int i = 0; i < n; i++) {
if(!(k&bin[i])) {
continue;
}
for(int j = 0; j < n; j++) {
if(k&bin[j]) {
continue;
}
dp[k | bin[j]] = max(dp[k | bin[j]], dp[k] + f[i][j]);
}
}
}
printf("%d\n", dp[bin[n]-1]);
}
return 0;
}

你可能感兴趣的:(dp,集合,职场,休闲)