Pebbles
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1222 Accepted Submission(s): 706
The player distributes pebbles across the board so that:
?At most one pebble resides in any given square.
?No two pebbles are placed on adjacent squares. Two squares are considered adjacent if they are horizontal, vertical, or even diagonal neighbors. There's no board wrap, so 44 and 61 of row three aren't neighbors. Neither are 33 and 75 nor 55 and 92.
The goal is to maximize the number of points claimed by your placement of pebbles.
Write a program that reads in a sequence of boards from an input file and prints to stdout the maximum number of points attainable by an optimal pebble placement for each.
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
572 683 2096 2755
lcy | We have carefully selected several similar problems for you: 2171 1565 2173 2169 2166
1.注意运算符的优先级!!! if((i & (i << 1)) == 0) 括号不能少
2.位运算的巧妙应用:
没有两个相邻1 <-> (i & (i >> 1)) == 0;
上下两行没有冲突<-> if(S[j] & S[k]))
if(S[j] & (S[k] << 1))
if(S[j] & (S[k] >> 1))
#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <queue>
using namespace std;
const int maxn = 112;
char str[maxn];
int mp[20][20];
int n;
int S[1 << 16];
int sum[20][1<<16];
int dp[20][1<<16];
int ssnum;
char ch;
int main()
{
while(gets(str))
{
ssnum = 0;
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
n = 0;
int len = strlen(str);
n = (len + 1) / 3;
for(int i=0;i<len;i+=3)
{
mp[0][i / 3] = (str[i] - '0') * 10 + (str[i+1] - '0');
}
for(int i=1;i<n;i++)
{
gets(str);
for(int j=0;j<len;j+=3)
{
mp[i][j / 3] = (str[j] - '0') * 10 + (str[j+1] - '0');
}
}
int upp = ( 1 << n);
for(int i=0;i<upp;i++)
{
if((i & (i << 1)) == 0) S[ssnum++] = i;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<ssnum;j++)
{
for(int k=0;k<n;k++)
{
if(S[j] & (1 << k))
sum[i][j] += mp[i][k];
}
}
}
for(int i=0;i<ssnum;i++)
{
dp[0][i] = sum[0][i];
}
for(int i=1;i<n;i++)
{
for(int j=0;j<ssnum;j++)
{
for(int k=0;k<ssnum;k++)
{
if(S[j] & S[k]) continue;
if(S[j] & (S[k] << 1)) continue;
if(S[j] & (S[k] >> 1)) continue;
dp[i][j] = max(dp[i][j],dp[i-1][k]+sum[i][j]);
}
}
}
int ans = -1;
for(int i=0;i<ssnum;i++)
{
ans = max(ans,dp[n-1][i]);
}
printf("%d\n",ans);
gets(str);
}
return 0;
}