Ex 6_5棋子放置问题_第八次作业

题目貌似有问题

(b)

子问题定义: 设maxValue[i][j]为棋盘的前i行中最后一行为i时第i行按照第j种放置方式放置时得到的最大覆盖值,comp[i][j]为第i种放置方式与第j种放置方式是否相容,value[i][j]为第i行按照第j种放置方式放置时覆盖整数的最大值,如此可以得到递归式。

递归关系:

初值设定:

maxValue的行数为棋盘的行数加一,因此令maxValue[0][j]=0表示没有棋盘时值为0

求解顺序:

按从上到下,从左到右的次序求解maxValue的每一行的值,最终返回maxValue的最后一行的最大值即为最终解。

  1 package org.xiu68.ch6.ex8;
  2
  3 public class Ex6_5 {
  4
  5
  6     public static void main(String[] args) {
  7         // TODO Auto-generated method stub
  8         int[][] chessBoard1=new int[][]{
  9             {1,2,3,4},
 10             {2,1,2,1}
 11         };
 12         maxChessBoard(chessBoard1);
 13
 14         int[][] chessBoard2=new int[][]{
 15             {0,1,0,1},
 16             {1,0,1,0},
 17             {1,2,1,2}
 18         };
 19         maxChessBoard(chessBoard2);
 20
 21         //运行结果
 22         /*
 23          被棋子覆盖的整数总和最大为: 10
 24         被棋子覆盖的整数总和最大为: 8
 25         */
 26
 27     }
 28
 29     //chessBoard:棋盘
 30     public static void maxChessBoard(int[][] chessBoard){
 31         int TYPE=8;                        //每一行可以放置的棋的种类数
 32         int rows=chessBoard.length;        //棋盘的行
 33         int cols=4;                        //棋盘的列
 34
 35         //comp[i][j]表示i、j两种放置模式是否相容,每行共8种放置方式
 36         boolean[][] comp=new boolean[][]{
 37             {true,true,true,true,true,true,true,true},
 38             {true,false,true,true,true,false,true,false},
 39             {true,true,false,true,true,true,false,true},
 40             {true,true,true,false,true,false,true,true},
 41             {true,true,true,true,false,true,false,false},
 42             {true,false,true,false,true,false,true,false},
 43             {true,true,false,true,false,true,false,false},
 44             {true,false,true,true,false,false,false,false}
 45         };
 46
 47          //每行8种放置方式,method[i][j]表示某一行在第i种放置方式下的第j列是否放棋
 48          boolean[][] method=new boolean[][]{
 49              {false,false,false,false},
 50              {true,false,false,false},
 51              {false,true,false,false},
 52              {false,false,true,false},
 53              {false,false,false,true},
 54              {true,false,true,false},
 55              {false,true,false,true},
 56              {true,false,false,true}
 57          };
 58
 59         //max[i][j]表示前i行中最后一行为i时第i行按照第j种放置方式的最大值
 60         int[][] max=new int[rows+1][TYPE];
 61         for(int i=0;i<TYPE;i++)
 62             max[0][i]=0;                //最小子问题,初始化为0
 63
 64         //value[i][t]表示第i行按照第t种方式放棋得到的值
 65         int[][] value=new int[rows][TYPE];
 66         //初始化value数组
 67         for(int i=0;i<rows;i++){
 68             for(int t=0;t<TYPE;t++){
 69
 70                 for(int j=0;j<cols;j++){
 71                     if(method[t][j]){        //第t种放置方式下第j列是否放棋
 72                         value[i][t]+=chessBoard[i][j];
 73                     }
 74                 }
 75
 76             }
 77         }
 78         //求max数组
 79         for(int i=1;i<max.length;i++){
 80             for(int t=0;t<TYPE;t++){
 81
 82                 max[i][t]=0;
 83                 for(int k=0;k<TYPE;k++){
 84                     if(!comp[t][k])        //t、k两种放置方式不相容
 85                         continue;
 86                     if(max[i-1][k]+value[i-1][t]>max[i][t])
 87                         max[i][t]=max[i-1][k]+value[i-1][t];
 88                 }
 89
 90             }
 91         }
 92
 93         //求max数组的最后一行的最大值即为最终解
 94         int maxValue=0;
 95         for(int i=0;i<TYPE;i++){
 96             if(max[max.length-1][i]>maxValue)
 97                 maxValue=max[max.length-1][i];
 98         }
 99         System.out.println("被棋子覆盖的整数总和最大为: "+maxValue);
100     }
101
102 }

时间: 2024-10-16 20:01:12

Ex 6_5棋子放置问题_第八次作业的相关文章

软件工程_东师站_第八周作业

一.PSP Date Type Job Start Interrupt(min) End Total(min) 20160417 助教 黄金点 20:00 5 21:00 55 20160418 助教 黄金点 19:00 12 21:00 108 20160419 助教 黄金点 18:45 100 23:00 155 20160420 助教 团队作业 10:00 35 11:20 45 20160425 结对编程 四则运算 19:00 5 19:30 25 ? 二.进度条 ? 代码行数 博客字数

Ex 6_21 最小点覆盖问题_第八次作业

子问题定义: 对于图中的每个结点,有两种状态,即属于最小点覆盖和不属于最小点覆盖,定义minSet[i][0]表示结点i属于点覆盖,并且以i为根的树的最小点覆盖的大小.minSet[i][1]表示点i不属于点覆盖,并且以i为根的树的最小点覆盖的大小. 递归关系: 对于minSet[i][0],i的孩子结点可以属于点覆盖,也可以不属于点覆盖,取其使以i为根的子树的点覆盖最小的情况,因此 对于minSet[i][1],由于i不属于点覆盖,因此其所有孩子结点都必须属于点覆盖,因此 初值设定: minS

耿丹16-1第八次作业

-- Deadline: 2016-11-14 20:00pm -- 作业内容:https://edu.cnblogs.com/campus/bjgygd/Sixteen-One/homework/178 -- 第八次作业总结: 1. 这次作业发布有些迟,所以迟交的同学,我目前没有扣分数,部分同学还未来得及交作业,请补上. 2. 表扬111.125.117.131.109.101.107.119等同学. 3. 大家遇到不会的题,参考别人代码时,请注明下!并且请认真验证,思考下程序的正确性!一定要

软件过程与项目管理第八次作业

软件项目与过程管理第八周作业 我们的小组项目已经基本完成了,这周我们小组的主要工作就是做测试和写测试文档. 我的主要任务是测试一些接口的功能,包括:Graph.Movies.System等等一些模块的接口,测试用的语言是lua,lua在上周已经简单的了解学习了一下.我们的测试主要用的是黑盒测试的边界值法.如对图片透明值的测试,GraphSetAlpha(int idx, int a)这个接口,设定一张指定图片的id后,我就将alpha值设置为小于0,等于0,0到225之间,225,大于225这么

深度学习与自然语言处理(4)_斯坦福cs224d 大作业测验1与解答

深度学习与自然语言处理(4)_斯坦福cs224d 大作业测验1与解答 作业内容翻译:@胡杨([email protected]) && @胥可([email protected]) 解答与编排:寒小阳 && 龙心尘 时间:2016年6月 出处: http://blog.csdn.net/han_xiaoyang/article/details/51760923 http://blog.csdn.net/longxinchen_ml/article/details/51765

3.30日第八次作业,第14章,采购管理,15章,信息文档和配置管理

3.30日第八次作业,第14章,采购管理,15章,信息文档和配置管理   第14章.采购管理1.采购管理包括哪些过程?(记)P382-383 答:1).编制采购计划.2).编制询价计划.3).询价.招投标.4).供方选择.5).合同管理.6).合同收尾. 2.编制采购计划过程的成果是什么?P386-387 答:1).采购管理计划.2).采购工作说明书. 3.判断:每个采购工作说明书都来自于项目范围基准.P387 答:是的. 4.结合P388页表14-1,工作说明书应该清楚地描述哪些内容?P388

14软件工程第八次作业

一点感悟 项目已经完工近一个星期了,这时候才写第八周作业好像有点晚. 可最开始真不知道该写些什么,又不想粘贴几个代码了事,所以一直拖到今天. 我这个人是有拖延症的.这病好像在我这儿就是绝症--没救了!项目最开始的时候,写立项书明书,写需求说明书,自己都是最拖拉的几个中的一个.明明就一两百字就可以解决的问题,总是一拖再拖.最后拖到自己写哪部分都差不多忘了.除了写书,设计代码时也拖,可以说前面几周我们根本没做什么,就后面两三周才真正做出了点东西--一点自己都不太好意思拿出手的项目. 我自认为在这个项

02组_现代软件工程_第03次作业——对于自身评价(原有水平以及长远目标分析总结)

02组_现代软件工程_第03次作业 --对于自身评价(原有水平以及长远目标分析总结) 李聿轩 ---------------------------------------------------------------------------- 一.原有水平 1.技术水平 ①Java基础开发 A.基本语法逻辑的代码完成 B.利用基本内容完成控件功能的设计以及实现 C.多线程的管理控制,队列,栈的使用相对较少 ②Android开发 A.会使用原生的控件显示,利用诸如Activity,Servic

2017-2018-1 JAVA实验站 第八周作业

2017-2018-1 JAVA实验站 第八周作业 团队分工 UML 用例图 类图 活动图 状态图 工具选择 windows系统自带的画图软件 ProcessOn