当前位置: 首页 > wzjs >正文

网站建设课程设计的必要性网络营销介绍

网站建设课程设计的必要性,网络营销介绍,免费开网店的平台有哪些,怎样保证网站的安全蒙德里安的梦想 求把 NM 的棋盘分割成若干个 12 的长方形,有多少种方案。 例如当 N2,M4时,共有 5 种方案。当 N2,M3 时,共有 3 种方案。 如下图所示: 输入格式 输入包含多组测试用例。 每组测试用例占…

蒙德里安的梦想

求把 N×M 的棋盘分割成若干个 1×2 的长方形,有多少种方案。

例如当 N=2,M=4时,共有 5 种方案。当 N=2,M=3 时,共有 3 种方案。

如下图所示:

2411_1.jpg

输入格式

输入包含多组测试用例。

每组测试用例占一行,包含两个整数 N 和 M。

当输入用例 N=0,M=0 时,表示输入终止,且该用例无需处理。

输出格式

每个测试用例输出一个结果,每个结果占一行。

数据范围

1≤N,M≤11

输入样例:
1 2
1 3
1 4
2 2
2 3
2 4
2 11
4 11
0 0
输出样例:
1
0
1
2
3
5
144
51205

观察样例,我们可以发现,横放的方案数等于总方案数

我们考虑按列摆放,某列的各行用0和1表示摆放状态

如果某行是1,表示横放,并且向下一列伸出

如果某行是0,表示竖放,或者由前一列伸出

在这里插入图片描述

状态表示f[i][j]表示摆放第i列,状态为j时的方案数

状态转移f[i - 1][k] -> f[i][j]

例如第i列状态为0011可以由上一列0000或者1100转移

在这里插入图片描述

因此状态计算 f[i][j] = ∑f[i - 1][k]

初值f[0][0] = 1,其他为0

目标为f[m][0]

解释代码中的几个部分,第一个预处理所有状态的合法性

//预处理所有状态的合法性,即不能够出现连续奇数个0
//枚举所有的状态
for(int i = 0; i < 1 << n; i++) {//每个状态的二进制位st[i] = true;//记录0的个数int cnt = 0;for(int j = 0; j < n; j++) {//如果该位是1if(((i >> j) & 1) == 1) {//判断0的个数是否是奇数if((cnt & 1) == 1) {//是奇数st[i] = false;cnt = 0;}} else {cnt ++;}}//判断最高位为0的情况if((cnt & 1) == 1) {st[i] = false;}
}

在这里插入图片描述

如果合并后的状态中出现了连续的奇数个0,则说明有无法通过竖放的方式填充的格子,此状态非法

第二个是状态计算

//初始化f[0][0] = 1,第一列状态为0时方案数为1
for(int i = 0; i < N; i++) {for(int j = 0; j < M; j++) {f[i][j] = 0;}
}
f[0][0] = 1;
//状态计算
//枚举每一列
for(int i = 1; i <= m; i++) {//枚举当前列的状态for(int j = 0; j < 1 << n; j++) {//枚举上一列的状态for(int k = 0; k < 1 << n; k++) {//判断两列状态合法(不出现重叠的1)if((j & k) == 0 && st[j | k]) {f[i][j] += f[i - 1][k];}}}
}

if((j & k) == 0 && st[j | k])这一行判断状态合法,条件一是不能出现重叠的1,合并后的状态如果不是0,则说明有重叠部分,如下图中左图

条件二是不能有连续的奇数个0,这个在上文中有过说明,使用预处理的结果即可 ,如下图中间图和右图

在这里插入图片描述

完整代码

import java.io.*;
import java.util.*;
public class Main {static final int N = 12;static final int M = 1 << N;static long f[][] = new long[N][M];static boolean st[] = new boolean[M];public static void main(String[] agrs) throws Exception {Scanner sc = new Scanner(System.in);while(true) {int n = sc.nextInt();int m = sc.nextInt();if(n == 0 && m == 0) {break;} //预处理所有状态的合法性,即不能够出现连续奇数个0//枚举所有的状态for(int i = 0; i < 1 << n; i++) {//每个状态的二进制位st[i] = true;//记录0的个数int cnt = 0;for(int j = 0; j < n; j++) {//如果该位是1if(((i >> j) & 1) == 1) {//判断0的个数是否是奇数if((cnt & 1) == 1) {//是奇数st[i] = false;cnt = 0;}} else {cnt ++;}}//判断最高位为0的情况if((cnt & 1) == 1) {st[i] = false;}}//初始化f[0][0] = 1,第一列状态为0时方案数为1for(int i = 0; i < N; i++) {for(int j = 0; j < M; j++) {f[i][j] = 0;}}f[0][0] = 1;//状态计算//枚举每一列for(int i = 1; i <= m; i++) {//枚举当前列的状态for(int j = 0; j < 1 << n; j++) {//枚举上一列的状态for(int k = 0; k < 1 << n; k++) {//判断两列状态合法(不出现重叠的1)if((j & k) == 0 && st[j | k]) {f[i][j] += f[i - 1][k];}}}}System.out.println(f[m][0]);}sc.close();}
}

最短Hamilton路径

给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径。

Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。

输入格式

第一行输入整数 n。

接下来 n 行每行 n 个整数,其中第 i 行第 j 个整数表示点 i 到 j 的距离(记为 a[i,j]])。

对于任意的 x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x]并且 a[x,y]+a[y,z]≥a[x,z]。

输出格式

输出一个整数,表示最短 Hamilton 路径的长度。

数据范围

1≤n≤20
0≤a[i,j]≤ 1 0 7 10^7 107

输入样例:
5
0 2 4 5 1
2 0 6 5 3
4 6 0 8 3
5 5 8 0 5
1 3 3 5 0
输出样例:
18

f[i][j] 表示所有从0号点走到j号点,走过的所有点是i的所有路径的最小值

例如i为101101表示除了第1个点和第4个点,其余点都走过了

状态计算根据倒数第二点来分类

如果倒数第二点i的状态是k的话

在这里插入图片描述

k到j的距离一定,则需要用从0到k的最小值加上k到j的值

0到k的最小值用状态表示为f[i - j所在点][k] + g[k][j]

import java.io.*;
import java.util.*;
public class Main {static final int N = 21;static final int M = 1 << N;static final int MAX_NUM = 2147483647 / 2;static int[][] g = new int[N][M];//f[i][j]表示从0走到j经过i这个状态的最小值(i用二进制表示经过了那些点)static int[][] f = new int[M][N];public static void main(String[] args) throws Exception{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());for(int i = 0; i < n; i++) {String[] row = br.readLine().split(" ");for(int j = 0; j < n; j++) {g[i][j] = Integer.parseInt(row[j]);}}//初始化f数组为正无穷for(int i = 0; i < M; i++) {for(int j = 0; j < N; j++) {f[i][j] = MAX_NUM;}}f[1][0] = 0;//枚举所有状态for(int i = 0; i < 1 << n; i ++) {//枚举所有的目标点for(int j = 0; j < n; j++) {//i这个状态中j这一位是1也就是包含j这一点的才有意义if(((i >> j) & 1) == 1) {//枚举所有的经过的点for(int k = 0; k < n; k++) {//i - (1 << j)这个状态中包含k这一点才有意义if((((i - (1 << j)) >> k) & 1) == 1) {f[i][j] = Math.min(f[i][j], f[i - (1 << j)][k] + g[k][j]);   }}}}}System.out.println(f[(1 << n) - 1][n - 1]);br.close();}
}
http://www.dtcms.com/wzjs/37650.html

相关文章:

  • 网站开发视频百度云百度产品
  • 自个做网站教程最近几天的重大新闻事件
  • 手表网站欧米茄价格腾讯控股第三季度营收1401亿
  • 北京商场skp班级优化大师官网登录
  • 制作商业网站网站创建公司
  • 可以做3d电影网站有哪些石家庄百度搜索优化
  • 专业做网站的人开封搜索引擎优化
  • 哈尔滨网站设计报价百度查询网
  • 维护网站需要多少钱武汉网站营销seo方案
  • 网站首页轮播图片素材国内免费发布产品的平台
  • 怎么样建设一个电影网站视频下载seo网络推广到底是做什么的
  • 手机门户WordPress主题windows11优化大师
  • 网站开发 与 网页设计的区别软文范例大全800字
  • 推广的网站有哪些全渠道营销
  • 上饶专业企业网站建设谷歌seo博客
  • 湖南网站建设公司谷歌搜索引擎为什么打不开
  • 建设银行嘉兴分行网站首页it培训学校哪家好
  • 西安哪里可以做公司网站免费网站在线客服软件
  • 建设公司网站费用怎么做账如何让自己的网站排名靠前
  • 免费制作自己的网站长产品品牌策划方案
  • 新的龙岗网站建设手机免费建网站
  • 做视频赚钱的网站有哪些百度账号登录不了
  • 政府网站建设赏析在线外链推广
  • 自己做壁纸的网站百度seo关键词排名价格
  • 做食品网站需要什么资质曼联vs曼联直播
  • 看男女做那个视频网站seo排名优化培训
  • 做网站那里做可靠深圳网络推广专员
  • 公交公司网站建设的意义南宁排名seo公司
  • 金属网站模板谷歌商店下载官方
  • 临沂哪里有做网站关键词优化包年推广