3471 Most Powerful (状态压缩)

题目大意:有n种原子,,两种原子相碰撞的话就会产生能量,其中的一种原子会消失。问这n种原子能产生的能量最大是多少

解题思路:用0表示该原子还没消失,1表示该原子已经消失,那么就可以得到状态转移方程了 dp[state | (1 << i)] = max(dp[state | (1 << i)], dp[state] + power[j][i]) 上面的方程表示的是在state的情况下,用j原子去碰撞i原子,i原子消失所能得到的最大能量

注意这题:产生的能量有可能是负的

;power[N][N];int dp[maxn];int n;int main() {while(scanf(“%d”, &n) != EOF && n) {for(int i = 0; i < n; i++)for(int j = 0; j < n; j++)scanf(“%d”, &power[i][j]);memset(dp, 0, sizeof(dp));for(int i = 0; i < (1 << n); i++)for(int j = 0; j < n; j++) {if((i & (1 << j)))continue;for(int k = 0; k < n; k++) {if(!(i & (1 << k)) && k != j) {dp[i | (1 << j)] = max(dp[i | (1 << j)], dp[i] + power[k][j]);}}}int ans = 0;for(int i = 0; i < (1 << n); i++)ans = max(ans, dp[i]);printf(“%d\n”, ans);}return 0;}

灿烂甜美!那一瞬的激-情绽放,催人奋进!胜利,永远属于为梦想奋斗的人新乐吧

3471 Most Powerful (状态压缩)

相关文章:

你感兴趣的文章:

标签云: