Pebbles

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1393    Accepted Submission(s): 797

Problem Description
You're given an unlimited number of pebbles to distribute across an N x N game board (N drawn from [3, 15]), where each square on the board contains some positive point value between 10 and 99, inclusive. A 6 x 6 board might look like this:

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. 

 
Input
Each board is expressed as a series of lines, where each line is a space-delimited series of numbers. A blank line marks the end of each board (including the last one)

 
Output
then your program would print the maximum number of points one can get by optimally distributing pebbles while respecting the two rules, which would be this (each output should be printed on a single line and followed with a newline):
 
Sample Input
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 }

状压DP

Pebbles(hdu2167)的更多相关文章

  1. HDU2167 Pebbles(状压DP)

    题目给一张n×n的格子,每个格子都有数字,要从格子中取若干个数字,八个方向相邻的数字不能一起取,问取的数字最大和是多少. 从第一行一行一行看下去,可以发现第1行取哪几列只会影响到第2行,第3行后面的一 ...

  2. [hdu2167]Pebbles

    来自FallDream的博客,未经允许,请勿转载,谢谢. 给定一个方阵,你要取出一些数字,满足没有两个格子八联通相邻的前提下和最大,求这个和 n<=15 插头dp,保存轮廓线以及目前转移点左上方 ...

  3. codeforces 507B. Painting Pebbles 解题报告

    题目链接:http://codeforces.com/problemset/problem/509/B 题目意思:有 n 个piles,第 i 个 piles有 ai 个pebbles,用 k 种颜色 ...

  4. 贪心 Codeforces Round #289 (Div. 2, ACM ICPC Rules) B. Painting Pebbles

    题目传送门 /* 题意:有 n 个piles,第 i 个 piles有 ai 个pebbles,用 k 种颜色去填充所有存在的pebbles, 使得任意两个piles,用颜色c填充的pebbles数量 ...

  5. Pebbles

    Pebbles Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  6. UVALive 7461 Separating Pebbles (计算几何)

    Separating Pebbles 题目链接: http://acm.hust.edu.cn/vjudge/contest/127401#problem/H Description http://7 ...

  7. B. Painting Pebbles

    B. Painting Pebbles time limit per test 1 second memory limit per test 256 megabytes input standard ...

  8. Bzoj 1982: [Spoj 2021]Moving Pebbles 博弈论

    1982: [Spoj 2021]Moving Pebbles Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 130  Solved: 88[Submi ...

  9. cf509B Painting Pebbles

    B. Painting Pebbles time limit per test 1 second memory limit per test 256 megabytes input standard ...

随机推荐

  1. matplotlib以对象方式绘制子图

    matplotlib有两种绘图方式,一种是基于脚本的方式,另一种是面向对象的方式 面向脚本的方式类似于matlab,面向对象的方式使用起来更为简便 创建子图的方式也很简单 fig,ax = plt.s ...

  2. 数仓:解读 NameNode 的 edits 和 fsimage 文件内容

    一.edits 文件 一)文件组成 一个edits文件记录了一次写文件的过程,该过程被分解成多个部分进行记录:(每条记录在hdfs中有一个编号) 每一个部分为: '<RECORD>...& ...

  3. Spark Stage 的划分

    Spark作业调度 对RDD的操作分为transformation和action两类,真正的作业提交运行发生在action之后,调用action之后会将对原始输入数据的所有transformation ...

  4. Yarn【架构、原理、多队列配置】

    目录 一.什么是yarn 二.yarn的基本架构和角色 三.yarn的工作机制 四.任务提交流程 五.资源调度器 FIFO 容量调度器 公平调度器 六.容量调度器多队列提交案例实操 1.案例:配置de ...

  5. 解决CSV文件用Excel打开乱码问题

    这篇文章适合有一定编码基础的人看,纯手动解决乱码问题请参见: 转码保存后,重新打开即可. 转码操作如下: 编辑器->另存为->ASCII码格式文件/UTF-8含BOM格式->保存. ...

  6. 【antd】表单-单页面多表单提交功能

    需求:多个表单,我想一起校验一起提交,比如这里的上下两个部分为两个组件,两个form表单 功能点:1.所有报表需通过校验 2.通过校验后提交并带入所有参数 核心问题:form表单的validateFi ...

  7. [BUUCTF]PWN——bjdctf_2020_babystack2

    bjdctf_2020_babystack2 附件 步骤: 例行检查,64位程序,开启了nx保护 尝试运行一下程序,看看情况 64位ida载入,习惯性的先检索程序里的字符串,发现了bin/sh,双击跟 ...

  8. [BUUCTF]PWN——hitcontraining_uaf

    [BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...

  9. CF816A Karen and Morning 题解

    Content 给定一个时间 \(h:m\),求从现在这个时间开始到下一个离该时间最近的回文时间要多久? 数据范围:\(0\leqslant h\leqslant 23,0\leqslant m\le ...

  10. Qt Creator 源码学习笔记04,多插件实现原理分析

    阅读本文大概需要 8 分钟 插件听上去很高大上,实际上就是一个个动态库,动态库在不同平台下后缀名不一样,比如在 Windows下以.dll结尾,Linux 下以.so结尾 开发插件其实就是开发一个动态 ...