标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1115 Accepted Submission(s): 482
13075053 | 2015-03-09 18:32:49 | Accepted | 4049 | 405MS | 2120K | 3076 B | G++ | czy |
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 #include <string> 7 #define N 15 8 9 using namespace std; 10 11 int n,m; 12 int p[N]; 13 int v[N][N]; 14 int b[N][N]; 15 int dp[N][ (1<<10) ]; 16 int ans; 17 int tot; 18 int happy[N][ (1<<10) ]; 19 20 vector<int> can[ (1<<10) ]; 21 22 int cal(int i,int o); 23 int ok(int k,int o); 24 25 void ini() 26 { 27 int i,j; 28 ans=0; 29 memset(dp,0,sizeof(dp)); 30 for(i=1;i<=m;i++){ 31 scanf("%d",&p[i]); 32 } 33 for(i=0;i<n;i++){ 34 for(j=1;j<=m;j++){ 35 scanf("%d",&v[i][j]); 36 } 37 } 38 for(i=0;i<n;i++){ 39 for(j=0;j<n;j++){ 40 scanf("%d",&b[i][j]); 41 } 42 } 43 int o; 44 tot = (1<<n); 45 for(i=1;i<=m;i++){ 46 for(o=0;o<tot;o++){ 47 dp[i][o]=-1000000000; 48 } 49 } 50 //printf(" n=%d m=%d tot=%d\n",n,m,tot ); 51 for(i=1;i<=m;i++){ 52 for(o=0;o<tot;o++){ 53 happy[i][o]=cal(i,o); 54 } 55 } 56 57 for(o=0;o<tot;o++){ 58 can[o].clear(); 59 for(int k=0;k<tot;k++){ 60 if(ok(k,o)==1){ 61 can[o].push_back(k); 62 } 63 } 64 } 65 } 66 67 int cal(int i,int o) 68 { 69 int re=0; 70 int j,k; 71 int cc=0; 72 //printf(" i=%d o=%d\n",i,o ); 73 for(j=0;j<n;j++){ 74 if( (1<<j) & o ){ 75 cc++; 76 re+=v[j][i]; 77 } 78 } 79 //printf(" 1 re=%d\n",re ); 80 for(j=0;j<n;j++){ 81 if( (1<<j) & o ){ 82 for(k=j+1;k<n;k++){ 83 if( (1<<k) & o ){ 84 re += b[j][k]; 85 } 86 } 87 } 88 } 89 // printf(" 2 re=%d\n",re ); 90 re -= p[i]*cc; 91 //printf(" 3 re=%d\n",re ); 92 //printf(" i=%d o=%d re=%d\n",i,o,re ); 93 return re; 94 } 95 96 int ok(int k,int o){ 97 int j; 98 for(j=0;j<n;j++){ 99 // printf(" j=%d\n",j ); 100 if( (1<<j) & o ){ 101 if( ( (1<<j) &k ) ==0 ){ 102 return 0; 103 } 104 } 105 } 106 return 1; 107 } 108 109 void solve() 110 { 111 int o,j,i,k; 112 int te; 113 for(i=1;i<=m;i++){ 114 //printf(" i=%d\n",i ); 115 for(o=0;o<tot;o++){ 116 // printf(" o=%d\n", o); 117 for(vector<int>::iterator it =can[o].begin();it != can[o].end();it++){ 118 // for(k=0;k<tot;k++){ 119 //printf(" k=%d\n", k); 120 k=*it; 121 // if(ok(k,o)==0) continue; 122 123 //te=cal(i,o); 124 te=happy[i][o]; 125 dp[i][o]=max(dp[i][o],dp[i-1][k]+te); 126 //printf(" i=%d o=%d dp=%d\n", i,o,dp[i][o]); 127 } 128 } 129 } 130 131 i=m; 132 for(o=0;o<tot;o++){ 133 //printf(" o=%d dp=%d\n",o,dp[m][o] ); 134 ans=max(ans,dp[m][o]); 135 } 136 } 137 138 void out() 139 { 140 if(ans<=0){ 141 printf("STAY HOME\n"); 142 } 143 else{ 144 printf("%d\n", ans); 145 } 146 } 147 148 int main() 149 { 150 while(scanf("%d%d",&n,&m)!=EOF){ 151 if(n==0 && m==0) break; 152 ini(); 153 solve(); 154 out(); 155 } 156 }
hdu 4049 Tourism Planning [ 状压dp ]
标签:
原文地址:http://www.cnblogs.com/njczy2010/p/4324225.html