[swustoj 183] 种树
种树(0183)
问题描述
Aconly有一块矩形的地,因为这块地里有很多石头,耕作很不方便,所以他打算在这块地上种一些果树。这块地用一个只含‘#’和‘*’的N*M的矩阵来表示,‘#’表示泥土,‘*’表示石头。当然有石头的地方是不能种树的,而且任意两棵树之间不能离得太近,表现在矩阵中就是不能上、下、左、右、左上、右上、左下、右下八个方向相邻。你的任务就是帮助Aconly算出这块地最多可以种多少棵树。
输入
有多组测试数据。每组测试数据以两个整数N和M开头,随后有N行只含‘#’和‘*’的字符,每行M个。 (1<=N<=100, 1<=M<=10)当M=N=0时表示输入结束。
输出
每组数据输出一个整数,表示Aconly最多可以在这块地里种多少棵树。每组输出数据占一行。
样例输入
5 4
####
**#*
##*#
####
##*#
0 0
样例输出
6
简单状压DP、代码还可以继续优化
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
#define ll long long
#define int2 unsigned int
#define MOD (1<<32)
#define INF 0x3f3f3f3f
#define N 1024 int n,m;
int a[N];
int dp[N][N]; //dp[i][j]表示第i行状态为j时的最大种树棵数
char mpt[N][N]; bool judge(int row,int sta)
{
if((a[row]&sta)!=sta) return ;
if(sta&(sta<<)) return ;
return ;
}
bool judge2(int r1,int r2)
{
if(r1&r2) return ;
if((r1<<)&r2 || (r1>>)&r2) return ;
return ;
}
int cal1(int n)
{
int ret=;
while(n){
ret+=n%;
n>>=;
}
return ret;
}
void solve()
{
int i,j,k;
int MAX=<<m;
dp[][]=;
for(i=;i<=n;i++){
for(j=;j<MAX;j++){
if(!judge(i,j)) continue;
for(k=;k<MAX;k++){
if(!judge2(j,k)) continue;
dp[i][j]=max(dp[i][j],dp[i-][k]+cal1(j));
}
}
}
int ans=;
for(i=n,j=;j<MAX;j++) ans=max(ans,dp[i][j]);
printf("%d\n",ans);
}
int main()
{
while(scanf("%d%d",&n,&m),n||m)
{
memset(a,,sizeof(a));
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
char ch;
scanf(" %c",&ch);
if(ch=='#') a[i]=(a[i]<<)+;
else a[i]=(a[i]<<);
}
}
solve();
}
return ;
}
[swustoj 183] 种树的更多相关文章
- [Data Structure] 数据结构中各种树
数据结构中有很多树的结构,其中包括二叉树.二叉搜索树.2-3树.红黑树等等.本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂. 1. 二叉树 二叉树是数据结构中一种重要 ...
- 种树 (codevs 1653) 题解
[问题描述] 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号为1..n.每个块大小为一个单位尺寸并最多可种一棵树.每个居民想在门前种些树并指定了三个号码b,e ...
- 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树
另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...
- SGU 183. Painting the balls( dp )
dp..dp(i, j)表示画两个点为i-j, i的最优答案. dp(i, j) = min{ dp(i-j, k) } + cost[i] (1≤k≤M-j) 令f(i, j) = min{dp(i ...
- 开源企业IM-免费企业即时通讯-ENTBOOST V2014.183 Windows版本号正式宣布
ENTBOOST,VERSION 2014.183 Windows(点击下载)版本号公布.主要添加PC端P2P(点对点)文件传输功能:公布安卓Android手机clientAPP 1.0版本号.公布苹 ...
- bzoj2151 种树 双向链表+堆
2151: 种树 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1151 Solved: 613[Submit][Status][Discuss] ...
- 【bzoj2151】种树
Time Limit: 1000ms Memory Limit: 128MB Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府 ...
- BZOJ_2151_种树_贪心+堆+链表
BZOJ_2151_种树_贪心+堆 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编 ...
- P1250 种树
P1250 种树 题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定 ...
随机推荐
- Spark小课堂Week3 FirstSparkApp(RDD开发)
Spark小课堂Week3 FirstSparkApp 问题:Java有哪些数据结构 大致有如下几种,其中List与Map是最重要的: List Map Set Array Heap Stack Qu ...
- Kakfa揭秘 Day7 Producer源码解密
Kakfa揭秘 Day7 Producer源码解密 今天我们来研究下Producer.Producer的主要作用就是向Kafka的brokers发送数据.从思考角度,为了简化思考过程,可以简化为一个单 ...
- Python生成验证码
#!/usr/bin/env python #coding:utf8 import random #方法1: str_code='zxcvbnmasdfghjklqwertyuiopZXCVBNMAS ...
- ajax的post用法
<button>点击之后,显示ajax返回的数据</button> 首先在页面上新建了一个按钮,点击这个按钮后,执行ajax操作,并将返回的字符串显示在按钮上. 下面是ajax ...
- 1036. Boys vs Girls (25)
#include <stdio.h>#include <string.h>int main(){ int n,i; while(scanf("%d",&am ...
- Oracle监听器—静态注册
注册就是将数据库作为一个服务注册到监听程序.客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库.这个服务名可能与实例名一样,也有可能不一样. 注册分: 1. 静 ...
- 进程(Process)和线程(Thread)的关系和区别
Definition定义-------------Process进程是应用程序的一次运行活动:从操作系统核 心角度来说,进程是操作系统分配和调度系统内存资源.cpu时间片等资源的基本单位,为正在运行的 ...
- 【BZOJ 2730】 [HNOI2012]矿场搭建
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- Xcode和github入门详细教程
Xcode和github详细教程! 主要是参考了现在网上的一些资料给没整过的人一个详细的指南. (1)先在github上注册账号,自行解决! (2)在导航栏右上角new一个repository(仓库) ...
- bnuoj 29368 Check the Identity(栈)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=29368 [题解]:模拟,然后对x,进行枚举,看是否所有都满足条件 [code]: #include ...