【ACM省赛】第九届河南省程序设计大赛 B 宣传墙

题目链接:http://nyoj.top/web/contest/problem/cid/13/num/B

题目:

用1*2的地砖,填满4*N的墙,有多少种方案。

题解:

状压dp,枚举每个状态的可能转移状态,再计算。

#include<bits/stdc++.h>
using namespace std;
const int mod=997;
const int maxn=1e6+10;
int a[maxn][16];
int main()
{
	a[1][0]=1;					//转移到第一列的时候,可能的方案为1。因为无法填入,所以只有0这一种状态 
	for(int i=2;i<1e6+5;i++)	//合法状态0 3 6 9 12 15 
	{
		a[i][0]=(a[i-1][0]+a[i-1][3]+a[i-1][9]+a[i-1][12]+a[i-1][15])%mod;
		a[i][3]=(a[i-1][0]+a[i-1][12])%mod;
		a[i][6]=(a[i-1][9])%mod;
		a[i][9]=(a[i-1][0]+a[i-1][6])%mod;
		a[i][12]=(a[i-1][0]+a[i-1][3])%mod;
		a[i][15]=(a[i-1][0])%mod;
	}
	int t;
	cin>>t;
	while(t--)
	{
		int n,m,k;
		cin>>n>>m>>k;
		int l=m-1,r=n-(k+m-1);
		printf("%d %d\n", a[l+1][0], a[r+1][0]); //输出下一列没溢出来的状态
	} 
	return 0;
} 

 

#include<bits/stdc++.h>
using namespace std;
long long dp[2][20];
const int mod=997;
int n=1000000,m=4;
int a[1000005];
void f()
{
	int total=1<<m,pre=0,now=1;
	memset(dp[now],0,sizeof(dp[now]));
	dp[now][0]=1;
	for(int i=0;i<n;i++)		//列 
	{
		for(int j=0;j<m;j++)	//行 
		{
			swap(now,pre);
			memset(dp[now],0,sizeof(dp[now]));
			for(int S=0;S<total;S++) 	//枚举状态
			{
				if( dp[pre][S] )
				{
					dp[now][S^(1<<j)]=(dp[now][S^(1<<j)]+dp[pre][S])%mod;
					if( j && S&(1<<(j-1)) && !(S&(1<<j)))
						dp[now][S^(1<<(j-1))]=(dp[now][S^(1<<(j-1))]+dp[pre][S])%mod;
				}
			}
		}
		a[i]=dp[now][0];
	}
}
int main()
{
	int t;
	cin>>t;
	f();
	while(t--)
	{
		int d,b,c;
        cin>>d>>b>>c;
        int x1=b-1;
        int x2=d-(b+c-1);
        
        cout<<a[x1-1]<<' ';
        cout<<a[x2-1]<<endl;
	}
}

 

全部评论

相关推荐

叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
06-19 19:06
门头沟学院 Java
码农索隆:别去东软,真学不到东西,真事
点赞 评论 收藏
分享
我是没经验的毕业生,这啥情况啊会不会是hr在刷kpi
JamesGosli...:字节boss属于是群发了,我都快入职字节了,其他部门还在和我boss打招呼
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务