标签:
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1393 Accepted Submission(s): 797
71 24 95 56 54 85 50 74 94 28 92 96 23 71 10 23 61 31 30 46 64 33 32 95 89 78 78 11 55 20 11 98 54 81 43 39 97 12 15 79 99 58 10 13 79 83 65 34 17 85 59 61 12 58 97 40 63 97 85 66 90 33 49 78 79 30 16 34 88 54 39 26 80 21 32 71 89 63 39 52 90 14 89 49 66 33 19 45 61 31 29 84 98 58 36 53 35 33 88 90 19 23 76 23 76 77 27 25 42 70 36 35 91 17 79 43 33 85 33 59 47 46 63 75 98 96 55 75 88 10 57 85 71 34 10 59 84 45 29 34 43 46 75 28 47 63 48 16 19 62 57 91 85 89 70 80 30 19 38 14 61 35 36 20 38 18 89 64 63 88 83 45 46 89 53 83 59 48 45 87 98 21 15 95 24 35 79 35 55 66 91 95 86 87 94 15 84 42 88 83 64 50 22 99 13 32 85 12 43 39 41 23 35 97 54 98 18 85 84 61 77 96 49 38 75 95 16 71 22 14 18 72 97 94 43 18 59 78 33 80 68 59 26 94 78 87 78 92 59 83 26 88 91 91 34 84 53 98 83 49 60 11 55 17 51 75 29 80 14 79 15 18 94 39 69 24 93 41 66 64 88 82 21 56 16 41 57 74 51 79 49 15 59 21 37 27 78 41 38 82 19 62 54 91 47 29 38 67 52 92 81 99 11 27 31 62 32 97 42 93 43 79 88 44 54 48
Sample Output
572 683 2096 2755
题意,放贝壳,要求四周不能有相临的贝壳,放的位置上有价值,求和理的方法中,价值最大的。
思路:状压dp,先筛选出(0,1<<15)内符合要求的状态,也就是考虑列上两个相邻的不能放的去掉,最终打表记录,可以发现符合要求的不过6000个不到。
然后dp[i][j],表示第i行第j种状态的最大价值。每一行的状态只和上一行的状态有关。转移方程dp[i][j]=max(dp[i][j],dp[i-1][x]+fu);
复杂度为你n*n*b;(n为符合的状态,b为层数);
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<iostream> 5 #include<stdlib.h> 6 #include<queue> 7 #include<stack> 8 int check(int n); 9 int check2(int n,int m); 10 typedef long long ll; 11 char a[2000][2000]; 12 int ma[20][20]; 13 int dp[20][10000]; 14 char b[2000]; 15 int kp[20]; 16 int mm[10000]; 17 using namespace std; 18 int main(void) 19 { 20 int n,i,j,k,p,q,m; 21 int bb=0; 22 for(i=0; i<(1<<15); i++) 23 { 24 if(check(i)) 25 { 26 mm[bb++]=i; 27 } 28 } 29 int kkk=0; 30 31 while(gets(b)!=NULL) 32 { 33 kkk++; 34 memset(dp,0,sizeof(dp)); 35 int l=strlen(b); 36 int sum=0; 37 int ans=10; 38 int cnt=0; 39 for(i=0; i<=l; i++) 40 { 41 if(b[i]==‘ ‘||i==l) 42 { 43 kp[cnt++]=sum; 44 sum=0; 45 } 46 else 47 { 48 sum*=ans; 49 sum+=b[i]-‘0‘; 50 } 51 } 52 53 for(i=0; i<cnt; i++) 54 { 55 ma[0][i]=kp[i]; 56 } 57 sum=0; 58 for(i=1; i<cnt; i++) 59 { 60 gets(b); 61 int y=strlen(b); 62 int vk=0; 63 for(j=0; j<=y; j++) 64 { 65 if(b[j]==‘ ‘||j==y) 66 { 67 ma[i][vk++]=sum; 68 sum=0; 69 } 70 else 71 { 72 sum*=10; 73 sum+=b[j]-‘0‘; 74 } 75 } 76 77 } 78 for(i=0; i<bb; i++) 79 { 80 if(mm[i]>(1<<cnt)) 81 { 82 break; 83 } 84 } 85 int uu=i; 86 for(i=0; i<uu; i++) 87 { 88 int zz=0; 89 for(j=0; j<cnt; j++) 90 { 91 if((1<<j)&mm[i]) 92 { 93 zz+=ma[0][j]; 94 } 95 } 96 dp[0][i]=zz; 97 } 98 int x; 99 for(i=1; i<cnt; i++) 100 { 101 for(j=0; j<uu; j++) 102 { 103 int fu=0; 104 for(int y=0; y<cnt; y++) 105 { 106 if((1<<y)&mm[j]) 107 { 108 fu+=ma[i][y]; 109 110 } 111 } 112 for(x=0; x<uu; x++) 113 { 114 if(check2(mm[x],mm[j])) 115 { 116 dp[i][j]=max(dp[i][j],dp[i-1][x]+fu); 117 118 } 119 } 120 121 } 122 123 } 124 int maxx=0; 125 for(i=0; i<uu; i++) 126 { 127 maxx=max(maxx,dp[cnt-1][i]); 128 } 129 printf("%d\n",maxx); 130 if(kkk) 131 { 132 getchar(); 133 } 134 } 135 return 0; 136 } 137 138 int check(int n) 139 { 140 if((n>>1)&(n)) 141 { 142 return 0; 143 } 144 else 145 { 146 return 1; 147 } 148 } 149 int check2(int n,int m) 150 { 151 int ss=(n>>1); 152 int vv=n<<1; 153 if(m&ss||vv&m||n&m) 154 { 155 return 0; 156 } 157 return 1; 158 }
标签:
原文地址:http://www.cnblogs.com/zzuli2sjy/p/5169973.html