zoj 3471
地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3471
题意:n种气体,每两种碰在一起会产生能量,然后后者消失。自己不能跟自己撞。求产生的最大能量。
mark:状态压缩dp。自己写的时候很忐忑,最后看解体报告发现跟自己思路一样,嘿嘿~
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define J1 (k|(1<<j)) #define J2 (k&(1<<j)) #define II (k&(1<<i)) const int M = 1024; const int N = 0xffffffff; int dp[M+10]; int max(int a, int b) {return a > b ? a : b;} int main() { int n,a[15][15]; int i,j,k; while(scanf("%d", &n), n) { memset(dp, 0, sizeof(dp)); for(i = 0; i < n; i++) for(j = 0; j < n; j++) scanf("%d", &a[i][j]); for(k = 0; k < (1 << n); k++) { for(i = 0; i < n; i++) { if(dp[II]) continue; for(j = 0; j < n; j++) { if(i == j || dp[J2]) continue; dp[J1] = max(dp[J1], dp[k]+a[i][j]); } } } for(i = j = 0; i < n; i++) j = max(j, dp[(1 << n)-1-(1 << i)]); printf("%d\n", j); } return 0; }