poj2441(状压dp)
来源:互联网 发布:数据挖掘入门 编辑:程序博客网 时间:2024/05/01 20:41
题目链接:http://poj.org/problem?id=2441,题意相当于给定n个公牛及它们各自想打的篮球场地,求取
方案数使得这n个公牛都有场地可打且这些场地均不重复。
看完《挑战程序设计竞赛》做的第一道状态压缩动态规划题,状态转移方程相对比较好想。注意这道数据
还是比较大,亦用滚动数组~~~
一开始我是用n作为第二维进行状态转移的,超时了~~~后来看了讨论,便转为m作为第二维,具体思路即:
f[S][j]表示前(j-1)个场地处理过达到状态S的方案数(其中S可压缩成一个整数,该整数的二进制位中,从右往左数
第k位若为1,表示序号为k的公牛已经有场地,否则该公牛未被分配场地。例如,若S=5,则其用二进制表示即
101,表示序号为1、3的公牛已有场地,而序号为2的未分配)
而f[S][j]=f[S][j+1](序号为j的场地不用)+f[S'][j+1](可先处理想打第j号场地的各公牛序号,然后看S,若该公牛
未被分配场地(即相应二进制位值为0),则可选将场地分配给其,然后S'即在S的基础上再将该公牛标记为
已被分配场地状态的状态)
注意对二进制位的一些基本操作:
1.求低到高位取n的第m位
int getBit(int n, int m){ return (n >> (m-1)) & 1; }2.从低到高位将n的第m位置为1
int setBitToOne(int n, int m){ return n | (1 << (m-1)); /*将1左移m-1位找到第m位,得到000...1...000 n在和这个数做或运算*/ }3.从低到高位将n的第m位置为0
int setBitToZero(int n, int m){ return n & ~(1 << (m-1)); /* 将1左移m-1位找到第m位,取反后变成111...0...1111 n再和这个数做与运算*/ }然后边界条件即f[(1<<n)-1][m+1]=1 (所有m个场地处理过,n个公牛都被分配场地了)
再注意点循环顺序~~~我的一开始一直TLE,后来改了一下,勉强过了,10s多poj上都能过,真是开挂了!
代码如下:
import java.util.Scanner;public class Main {static int n, m, num;static int arr[][], size[], total[], choose[][];static int f[];static boolean bo[][];public static void main(String[] args) {// TODO Auto-generated method stubScanner reader = new Scanner(System.in);n = reader.nextInt();m = reader.nextInt();arr = new int[n + 1][m + 1];size = new int[n + 1];bo = new boolean[n + 1][m + 1];for (int i = 1; i <= n; i++) {size[i] = reader.nextInt();for (int j = 1; j <= size[i]; j++) {arr[i][j] = reader.nextInt();bo[i][arr[i][j]] = true;}}choose = new int[m + 1][n + 1];total = new int[m + 1];for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)if (bo[j][i]) {total[i]++;choose[i][total[i]] = j;}f = new int[1 << n];f[(1 << n) - 1] = 1;num = (1 << n) - 1;int num2;for (int i = m; i >= 1; i--) {for (int j = 0; j <= num; j++) {for (int k = 1; k <= total[i]; k++) {num2 = choose[i][k];if ((j >> (num2 - 1) & 1) == 0)f[j] += f[j | 1 << (num2 - 1)];}}}System.out.println(f[0]);}}
0 0
- poj2441 状压dp
- poj2441(状压dp)
- poj2441(状压dp)
- poj2441(状压dp)
- poj2441 Arrange the Bulls 状压DP
- 状态压缩DP+poj2441
- poj2441(状态压缩dp)
- POJ2441 Arrange the Bulls 状态压缩DP
- Arrange the Bulls(poj2441)状态压缩dp
- poj2441 poj1185 状态压缩DP
- POJ2441--Arrange the Bulls
- [poj2441]Arrange the Bulls
- [poj2441]Arrange the Bulls
- POJ2441-Arrange the Bulls
- POJ2441 2441 Arrange the Bulls
- poj2441 状态压缩~放置方案数
- 状压dp
- 状压dp
- Java8初体验(二)Stream语法详解
- java按像素压缩,生成压缩图片。
- LeetCode 112. Path Sum
- extern和static的理解
- 《深入理解java虚拟机》笔记——第四章 虚拟机性能监控与故障处理工具
- poj2441(状压dp)
- Java qq登录界面设计
- opencv3.2.0+CUDA8.0+Eigen3.0.5+VS2010+WIN7+x64环境部署
- 算法与数据结构【二】简单链表的实现
- 基类,继承类的初始化顺序
- MLlib-基本统计计算
- angularJs实现增删改查示例2-JS文件
- Struts2-14 文件的上传与下载
- APP实用开发——TextSwitcher实现文本自动垂直滚动