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; } 

你可能感兴趣的:(ZOJ - 3471 Most Powerful)