ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1593 【例 2】牧场的安排

2021-02-21 21:02:34  阅读:250  来源: 互联网

标签:方案 int 草地 安排 牧场 土地 1593 FJ


1593:【例 2】牧场的安排

时间限制: 1000 ms 内存限制: 524288 KB
提交数: 653 通过数: 426
【题目描述】
原题来自:USACO 2006 Nov. Gold

Farmer John 新买了一块长方形的牧场,这块牧场被划分成 M 行 N 列 (1≤M≤12;1≤N≤12),每一格都是一块正方形的土地。FJ 打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用。遗憾的是,有些土地相当的贫瘠,不能用来放牧。并且,奶牛们喜欢独占一块草地,于是 FJ 不会选择两块相邻的土地,即:没有哪两块草地有公共边。当然,FJ 还没有决定在哪些土地上种草。

作为一个好奇的农场主,FJ 想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择。当然,把新的牧场荒废,不在任何土地上种草,也算一种方案。请你帮 FJ 算一下这个总方案数。

【输入】
第 1 行:两个正整数 M 和 N,用空格隔开;

第 2 到 M+1 行:每行包含 N 个用空格隔开的整数,描述了每块土地的状态。输入的第 i+1 行描述了第 i 行的土地。所有整数均为 0 或 1,1 表示这块土地足够肥沃,0 则表示这块地上不适合种草。

【输出】
第 1 行:输出一个整数,即牧场分配总方案数除以 108 的余数。

【输入样例】
2 3
1 1 1
0 1 0
【输出样例】
9
【提示】
样例说明

按下图把各块``土地编号:

1 2 3
0 4 0
只开辟一块草地有 4 种方案:选 1,2,3,4 中的任一块。开辟两块草地的话,有 3 种方案:13,14 以及 34。选三块草地只有一种方案:134。再加把牧场荒废的那一种,总方案数为 4+3+1+1=9 种。

数据范围与提示:

1≤N,M≤12。

思路:
很基础的板子题,注意一个小技巧,因为题目中给出每行的限制,所以我们先把限制压缩,由于我们预处理的时候用的是&运算,所以为了符合题目要求,我们把原来的1存成0,把原来的0存成1,这样的话对于原来的0(现在的1)来说只能荒着,而对于原来的1现在的0来说荒着不荒都可以

代码:

#include<bits/stdc++.h>
using namespace std;

int n,m,f[1020][1020];
struct node{
	int s[5000],sum;
}a[5020];


void dp()
{
	for(int i=1;i<=a[1].sum ;i++) f[1][i]=1;
	
	for(int i=2;i<=n;i++)
		for(int j=1;j<=a[i].sum ;j++)
		{
			f[i][j]=0;
			for(int k=1;k<=a[i-1].sum ;k++)
			{
				if(!(a[i-1].s[k]&a[i].s[j])) f[i][j]+=f[i-1][k];
			}
		}
		
	/*for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=a[i].sum  ;j++) cout<<f[i][j]<<" ";
		cout<<'\n';
	}*/
		
	int ans=0;
	for(int i=1;i<=a[n].sum ;i++)
	{
		ans=(ans+f[n][i])%100000000;
	}
	
	cout<<ans<<'\n';
}

void prepare(int i,int t)
{
	int num=0;
	for(int j=0;j<(1<<m);j++)
	{
		if(!(j&(j<<1))&&!(j&(j>>1))&&!(j&t))
		{
			a[i].s[++num]=j;
		}
	}
	
	a[i].sum=num;
}

void init()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int t=0;
		for(int j=1;j<=m;j++)
		{
			int x;
			cin>>x;
			t=(t<<1)+1-x;
		}
		prepare(i,t);
	}
}

int main()
{
	init();
//	prepare();
	dp();
	return 0;
}

ps:有点坑的地方:状态总共有1<<m而不是1<<n

标签:方案,int,草地,安排,牧场,土地,1593,FJ
来源: https://www.cnblogs.com/yxr001002/p/14427142.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有