zoukankan      html  css  js  c++  java
  • POJ3254 Corn Fields 状态压缩DP

    看了这位博主的经历

    http://blog.csdn.net/lenleaves/article/details/7972224

    感觉有些差点儿相同,由于CF比赛状压被虐 所以開始刷刷题,从最简单的開始复习吧,细节处理非常差。唉


    DP方程跟一般的有些不一样。dp[i][j]表示在状态i的情况下 到第j行的摆放有多少种,然后总数就是 dp[i][n - 1]求和,以第一行为边界往下推。第一行边界值为1。由于从第一行開始当前状态当然就一种摆法了,但是原图本身就有些地方能放不能放的,一開始放在一起处理了非常烦弄不清晰了,后来看了别人的。先处理掉原图的合法不合法,看来我太年轻,这样接下来就非常清晰了,当然题目说 每一行都不放也是一种状态,一開始给看漏了。结果一直案例跑错,还以为推错了,看方程看了半年


    #define MOD 100000000
    
    int n,m,cnt;
    
    int mp[15];
    int aa[1<<15];
    int dp[1<<15][15];
    
    void init() {
    	memset(mp,0,sizeof(mp));
    	memset(dp,0,sizeof(dp));
    	memset(aa,0,sizeof(aa));
    }
    
    bool input() {
    	while(scanf("%d %d",&n,&m) == 2) {
    		for(int i=0;i<n;i++)
    			for(int j=0;j<m;j++){
    				int x;
    				scanf("%d",&x);
    				if(x == 0)mp[i] |= (1<<(m - j - 1));//不能放的拎出来
    			}
    			return false;
    	}
    	return true;
    }
    
    bool isok1(int x) {
    	if(x&(x<<1))return 0;//判相邻两列
    	return 1;
    }
    
    bool isok2(int x,int i) {
    	if(x&mp[i])return 0;
    	return 1;
    }
    
    void cal() {
    	cnt = 0;
    	for(int i=0;i<(1<<m);i++) 
    		if(isok1(i))aa[cnt++] = i;//先把与原图就冲突的给排掉留下合法的
    	for(int i=0;i<cnt;i++)
    		if(isok2(aa[i],0))dp[aa[i]][0] = 1;
    	for(int i=1;i<n;i++) {
    		for(int j=0;j<cnt;j++) {
    			if(!isok2(aa[j],i))continue;
    			for(int k=0;k<cnt;k++)//一開始这里令j != k由于相邻两行状态肯定不一样,但是忽略了两行都能够不放 
    				if(isok2(aa[k],i - 1) && !(aa[k]&aa[j])/*判上下行是否合法*/)
    					dp[aa[j]][i] = (dp[aa[j]][i] + dp[aa[k]][i - 1])%MOD;
    		}
    	}
    }
    
    void output() {
    	int ans = 0;
    	for(int i=0;i<cnt;i++)
    		ans = (ans + dp[aa[i]][n - 1])%MOD;
    	cout<<ans<<endl;
    }
    
    int main () {
    	while(true) {
    		init();
    		if(input())return 0;
    		cal();
    		output();
    	}
    }


  • 相关阅读:
    数据库命令基本操作
    26、驱动模块和桩模块的概念和区别
    图像的均值、均方值、方差、均方差、标准差
    67、反射机制
    66、线程的生命周期
    PHP 的 SAPI 是个什么东西(转)
    无需重新编译安装PHP扩展的方法
    swoole之创建子进程
    swoole之异步文件IO
    swoole之任务和定时器
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5407080.html
Copyright © 2011-2022 走看看