思路:
状压dp。
实现:
1 class Solution { 2 public: 3 int connectTwoGroups(vector<vector<int>>& cost) { 4 int n=cost.size(),m=cost[0].size(); 5 vector<vector<int>>mp(n,vector<int>(1<<m,0)); 6 for(int i=0;i<n;i++){ 7 for(int j=0;j<1<<m;j++){ 8 int k=j; 9 int id=0; 10 int sum=0; 11 while(k){ 12 if(k&1){ 13 sum+=cost[i][id]; 14 } 15 k>>=1; 16 id++; 17 } 18 mp[i][j]=sum; 19 } 20 } 21 vector<vector<int>>dp(n,vector<int>(1<<m,0x3f3f3f3f)); 22 for(int j=0;j<1<<m;j++){ 23 dp[0][j]=mp[0][j]; 24 } 25 for(int i=1;i<n;i++){ 26 for(int j=0;j<1<<m;j++){ 27 int k=j; 28 int id=0; 29 while(k){ 30 if(k&1){ 31 dp[i][j]=min(dp[i][j],dp[i-1][j]+cost[i][id]); 32 } 33 k>>=1; 34 id++; 35 } 36 for(int k=j;k;k=(k-1)&j){ 37 if(k==j)continue; 38 dp[i][j]=min(dp[i][j],dp[i-1][k]+mp[i][j-k]); 39 } 40 } 41 } 42 return dp[n-1][(1<<m)-1]; 43 } 44 };