[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 0;
    if(sta&(sta<<1)) return 0;
    return 1;
}
bool judge2(int r1,int r2)
{
    if(r1&r2) return 0;
    if((r1<<1)&r2 || (r1>>1)&r2) return 0;
    return 1;
}
int cal1(int n)
{
    int ret=0;
    while(n){
        ret+=n%2;
        n>>=1;
    }
    return ret;
}
void solve()
{
    int i,j,k;
    int MAX=1<<m;
    dp[0][0]=0;
    for(i=1;i<=n;i++){
        for(j=0;j<MAX;j++){
            if(!judge(i,j)) continue;
            for(k=0;k<MAX;k++){
                if(!judge2(j,k)) continue;
                dp[i][j]=max(dp[i][j],dp[i-1][k]+cal1(j));
            }
        }
    }
    int ans=0;
    for(i=n,j=0;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,0,sizeof(a));
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                char ch;
                scanf(" %c",&ch);
                if(ch==‘#‘) a[i]=(a[i]<<1)+1;
                else a[i]=(a[i]<<1);
            }
        }
        solve();
    }
    return 0;
}
时间: 2024-10-08 08:16:06

[swustoj 183] 种树的相关文章

种树(贪心)

2151: 种树 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 714  Solved: 397[Submit][Status][Discuss] Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度.但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i

【BZOJ 2151】 2151: 种树 (贪心+堆)

2151: 种树 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度.但由于A城市土壤肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置.值得注意的是1号和n号也算相邻位置!).最终市政府给园林部门提供了m棵树苗并要求全部种上,请你帮忙设计种树方案使得美观度总和最大.如果无法将m棵树苗

雷军:做安卓平板生态 总要有人先种树

文/雷军 不少米粉一直都在呼吁我们做平板,在此之前市场上的Android平板也不少.但为什么小米创业四年后我们才开始做?因为平板是个非常难做的产品. 苹果CEO Tim Cook没少挖苦Android平板.去年他说, iPad占据了平板市场 81%的流量份额,众多Android平板加起来过 19%.前年他甚至还说过,所有的Android平板都在仓库里或者用户的抽屉里吃灰. 从硬件角度看,Android平板并不是很难做.市场上各类Android板满天飞,有的很贵要好几千元,也有很多性能很差的平板便

B1/B2签证的有效期——对于B1/B2签证,停留期最长不超过183天

一.关于签证有效期首先我们要知道当我们历经困难从签证官手里拿到自己的签证的时候,签证上面有个时间这个我们叫做签证有效期.B1/B2一般是一年多次往返的,这个只跟你申请的签证类型有关,与你填表的时候写的预计赴美时间和在美停留时间实际上关系不大!当B1/B2签证被美国外交部批准,一般来说会是一年多次往返(visa上会注明multiple).这个一年是指从签证获准之日起后的365天,都是签证有效期.在这个有效期内,你有权选择任何日子来美,也可以放弃这项权利.多次往返理论上讲可以是今天飞来美国,明天飞回

Ectra Credit 180,181,182,183,184,185,186,187,188,189,190

180 What Makes a Good TCG or CCG? 这期讲了收集游戏的好处. 收集类游戏强制你获得新的卡片,每当你获得这些卡片的时候你就得考虑新的策略.这样玩家就可以不断地探索游戏机制. 收集类游戏的学习曲线比较平滑. 由于系统本身的庞大,很难找到最佳策略,同时也就有了很多思考空间. 181 Making Games for Players Under 14 为小孩造游戏 你得将这个年龄段的孩子分层:4-6,7-9,10-11,12-14 要让孩子即使没有指导也能游戏. 这些孩子

洛谷P1250种树(贪心)

题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E,T.这三个数表示该居民想在B和E之间最少种T棵树.当然,B≤E,居民必须记住在指定区不能种多于区域地块数的树,所以T≤E-B+l.居民们想种树的各自区域可以交叉.你的任务是求出能满足所有要求的最少的树的数量. 写一个程序完成以下工作: 输入输出格式 输入格式: 第一行包含数据N,区域的个数(0<N≤

1768 种树 3

1768 种树 3 2012年 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 为了绿化乡村,H村积极响应号召,开始种树了. H村里有n幢房屋,这些屋子的排列顺序很有特点,在一条直线上.于是方便起见,我们给它们标上1~n.树就种在房子前面的空地上. 同时,村民们向村长提出了m个意见,每个意见都是按如下格式:希望第li个房子到第ri个房子的房前至少有ci棵树. 因为每个房屋前的空地面积有限,所以每个房屋前

&lt;swustoj&gt;?id=203 Jack&#39;s problem

链接http://acm.swust.edu.cn/problem/203/ #include <stdio.h> int main() { double x1,x2,x3,y1,y2,y3; double s; while(~scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3)) { s=(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2)*1

开源企业IM-免费企业即时通讯-ENTBOOST V2014.183 Windows版本正式发布

ENTBOOST,VERSION 2014.183 Windows(点击下载)版本发布,主要增加PC端P2P(点对点)文件传输功能:发布安卓Android手机客户端APP 1.0版本:发布苹果IOS手机(平板)客户端SDK测试版本,完善安卓SDK功能及部分BUG修正: 企业私有云各版本下载列表:download 下一版本发布时间,7月28日,敬请关注! ENTBOOST是跨平台.跨应用的实时通讯平台:恩布网络致力于帮助开发者.软件公司和企业,组建企业级的即时通讯平台和运营平台:提供跨终端.跨应用