zoukankan      html  css  js  c++  java
  • 【Luogu1879】玉米田(状态压缩,动态规划)

    懒得搞题目了
    哦对了,这题双倍经验

    题解

    装压DP
    利用位运算很容易解决相邻位的问题
    其实我的还是太复杂了
    具体的,更加好的位运算的写法可以参考YL大佬,但是我也搞不到他代码,因为他太强了。
    然而他博客停更了。。。。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    #define MOD 100000000
    #define INF 100000000
    inline int read()
    {
    	register int x=0,t=1;
    	register char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-'){t=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    	return x*t;
    }
    int f[15][1<<13];
    int n,m,g[15];
    bool check(int x)
    {
    	for(int i=1;i<m;++i)
    		if(x&(1<<i)&&x&(1<<(i-1)))return false;
    	return true;
    }
    int main()
    {
    	m=read();n=read();
    	for(int i=1;i<=m;++i)
    		for(int j=1;j<=n;++j)
    			g[j]|=(read())<<(i-1);
    	f[0][0]=1;
    	for(int i=1;i<=n;++i)
    	{
    		for(int j=0;j<(1<<m);++j)
    		{
    			if((j&g[i-1])!=j)continue;
    			if(!check(j))continue;
    			for(int k=0;k<(1<<m);++k)
    			{
    				if(k&j)continue;
    				if((k&g[i])!=k)continue;
    				if(!check(k))continue;
    				f[i][k]=(f[i][k]+f[i-1][j])%MOD;
    			}
    		}
    	}
    	int ans=0;
    	for(int i=0;i<(1<<m);++i)
    		ans=(ans+f[n][i])%MOD;
    	printf("%d
    ",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    14.7.1 重新调整InnoDB系统表空间的大小
    css代码引入方式与基本选择器
    html常用标签
    python数据库操作
    pt-osc使用一则
    mysql优化一则(20170703)
    进程与生产者消费者模型
    面向对象程序设计
    常用模块
    模块与包
  • 原文地址:https://www.cnblogs.com/cjyyb/p/7708522.html
Copyright © 2011-2022 走看看