POJ 3254 Corn Fields 状态压缩dp入门

本文介绍了一种使用状态压缩动态规划解决特定类型问题的方法。通过二进制表示来简化复杂问题,利用位运算符进行高效计算。文章通过一个具体的例子详细解释了如何实现状态压缩,并给出了完整的代码示例。

原文:http://blog.youkuaiyun.com/y990041769/article/details/24658419

在原文基础上,加上自己的理解

状态压缩dp入门

1、二进制的移动知识基础:

#include <cstdio>
int main()
{
	int k=5;
	printf("%d\n", 1<<k);// 1 向左移动k位 100000,2^5 32
	printf("%d\n", 1>>k);// 1 向右移动k位 0.00001,为0 
	printf("%d\n", k<<1);// k 向左移动1位 101 -> 1010 即k*2=10
	printf("%d\n", k>>1);// k 向右移动1位 101 -> 10.1 即k/2=2
	return 0;
}

 2、& 的妙用

同为1 才为1,不然就是0,

很巧妙的相错开来


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; 
const int N=15;
const int M=1<<N;//10000000000000
const int mod = 100000000;
int st[M],mp[M];
int dp[N][M];//表示dp[i][j] 在i行 状态为j时 放牛的种数 
int jud1(int x){
	//相邻是否一样  
	return (x&(x<<1));
}
int jud2(int i,int x){
	return (mp[i]&st[x]);
}
int main()
{
	int n,m,x;
	while(~scanf("%d%d",&n,&m)){
		memset(st,0,sizeof(st));
		memset(mp,0,sizeof(mp));
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				scanf("%d",&x);
				if(x==0)
				//第i行的土地状况 可以累加出来 
				//而且这个土地情况 是 与真实的是相反的 
					mp[i]=mp[i]+(1<<(j-1)); 
			}
		}
		int k=0;
		//枚举m位 不同的0,1情况
		//只有相邻不同的数,左移一位相互交错,数值为0 
		//st[] 存每一行相互交错的情况 ,总交错状态数为 k 
		for(int tm=0;tm<(1<<m);tm++){
			if(  !jud1(tm)  )
				st[k++]=tm;
		}
		for(int j=0;j<k;j++){
			// 找出与第一行土地 状态为j ,且与土地交错的
			// 那么初始化为1 
			if( !jud2(1,j) )
				dp[1][j]=1;
		}
		for(int i=2;i<=n;i++){                 //枚举行数 
			for(int j=0;j<k;j++){              //枚举上一行的状态数 
			
				//一:第i行状态j 与 第i行土地交错
				if(jud2(i,j))
					continue;
				for(int f=0;f<k;f++){          //枚举下一行的状态数
				 
				//二:与第i行的上一行的土地也要交错  
					if(jud2(i-1,f))
						continue;
						
				//三:上一行状态j 和这一行状态f 也要交错 
					if(!(st[j]&st[f]))
						dp[i][j]+=dp[i-1][f];
				}
			}
		}
		//dp[最后一行][不同方案] 总值累加起来,就是结果   
		int ans=0;
		for(int j=0;j<k;j++){
			ans+=dp[n][j];
			ans%=mod;
		}
		printf("%d\n",ans);
	}
	return 0;
}


已经博主授权,源码转载自 https://pan.quark.cn/s/053f1da40351 在计算机科学领域,MIPS(Microprocessor without Interlocked Pipeline Stages)被视作一种精简指令集计算机(RISC)的架构,其应用广泛存在于教学实践和嵌入式系统设计中。 本篇内容将深入阐释MIPS汇编语言中涉及数组处理的核心概念与实用操作技巧。 数组作为一种常见的数据结构,在编程中能够以有序化的形式储存及访问具有相同类型的数据元素集合。 在MIPS汇编语言环境下,数组通常借助内存地址与索引进行操作。 以下列举了运用MIPS汇编处理数组的关键要素:1. **数据存储**: - MIPS汇编架构采用32位地址系统,从而能够访问高达4GB的内存容量。 - 数组元素一般以连续方式存放在内存之中,且每个元素占据固定大小的字节空间。 例如,针对32位的整型数组,其每个元素将占用4字节的存储空间。 - 数组首元素的地址被称为基地址,而数组任一元素的地址可通过基地址加上元素索引乘以元素尺寸的方式计算得出。 2. **寄存器运用**: - MIPS汇编系统配备了32个通用寄存器,包括$zero, $t0, $s0等。 其中,$zero寄存器通常用于表示恒定的零值,$t0-$t9寄存器用于暂存临时数据,而$s0-$s7寄存器则用于保存子程序的静态变量或参数。 - 在数组处理过程中,基地址常被保存在$s0或$s1寄存器内,索引则存储在$t0或$t1寄存器中,运算结果通常保存在$v0或$v1寄存器。 3. **数组操作指令**: - **Load/Store指令**:这些指令用于在内存与寄存器之间进行数据传输,例如`lw`指令用于加载32位数据至寄存器,`sw`指令...
根据原作 https://pan.quark.cn/s/cb681ec34bd2 的源码改编 基于Python编程语言完成的飞机大战项目,作为一项期末学习任务,主要呈现了游戏开发的基本概念和技术方法。 该项目整体构成约500行代码,涵盖了游戏的核心运作机制、图形用户界面以及用户互动等关键构成部分。 该项目配套提供了完整的源代码文件、相关技术文档、项目介绍演示文稿以及运行效果展示视频,为学习者构建了一个实用的参考范例,有助于加深对Python在游戏开发领域实际应用的认识。 我们进一步研究Python编程技术在游戏开发中的具体运用。 Python作为一门高级编程语言,因其语法结构清晰易懂和拥有丰富的库函数支持,在开发者群体中获得了广泛的认可和使用。 在游戏开发过程中,Python经常与Pygame库协同工作,Pygame是Python语言下的一款开源工具包,它提供了构建2D游戏所需的基础功能模块,包括窗口系统管理、事件响应机制、图形渲染处理、音频播放控制等。 在"飞机大战"这一具体游戏实例中,开发者可能运用了以下核心知识点:1. **Pygame基础操作**:掌握如何初始化Pygame环境,设定窗口显示尺寸,加载图像和音频资源,以及如何启动和结束游戏的主循环流程。 2. **面向对象编程**:游戏中的飞机、子弹、敌人等游戏元素通常通过类的设计来实现,利用实例化机制来生成具体的游戏对象。 每个类都定义了自身的属性(例如位置坐标、移动速度、生命值状态)和方法(比如移动行为、碰撞响应、状态更新)。 3. **事件响应机制**:Pygame能够捕获键盘输入和鼠标操作事件,使得玩家可以通过按键指令来控制飞机的移动和射击行为。 游戏会根据这些事件的发生来实时更新游戏场景状态。 4. **图形显示与刷新**:...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值