矩阵游戏java_矩阵取数游戏JAVA题解
话不多说,先上题目: 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的nm的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下: {C}1. 每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素; {C}2. 每次取走的各个元素只能是该元素所在行的行首或行尾; {C}3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值2i,其中i表示第i次取数(从1开始编号); {C}4. 游戏结束总得分为m次取数得分之和。 帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。
样例1:
2 3 1 2 3 3 4 2 样例2:
1 4 4 5 0 5 样例3:
2 10 96 56 54 46 86 12 23 88 80 43 16 95 18 29 30 53 88 83 64 67 样例1: 82 样例2: 122 样例3: 316994 【输入输出样例1解释】 第1次:第1行取行首元素,第2行取行尾元素,本次得分为121+221=6 第2次:两行均取行首元素,本次得分为222+322=20 第3次:得分为323+423=56。总得分为6+20+56=82 【限制】 60%的数据满足:1<=n, m<=30, 答案不超过1016 100%的数据满足:1<=n, m<=80, 0<=aij<=1000
这就是NOIP2007T3的题目,这里我给出一个JAVA的解法,至于为什么选择JAVA因为这一题涉及大数运算,使用JAVA能减少很多的工程。
好了,废话不多说,先讲讲我的思路: 首先我们从题目可以知道,所谓的矩阵取数说白了就是求每一个行的最佳取数方法,那么要解决的问题就简化为一个双端队列的取数问题了。我们知道,每取完一个数以后,队列就会变成一个新的双端队列,而且无论你的取数顺序如何,最终还是需要相同的取数步数,因此这是个dp问题,而这题的核心思想即使对于同一个子队列,接下来的操作不会受到之前的操作的影响,于是我们只要保证我们找到生成这个子队列的最优解法就行了。于是我在这里用了一个矩阵来表示取数的结果,k表示取数的步数,当从前端取数的时候则往矩阵下边走,当从后端取数的时候则往右边走,若遇到走入同一个空格的情况则取其最大值,于是当走完m步以后,则会出现一个对角线型的结果图,只要沿着对角线找出最大值输出来即为题解了。
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
static int m;
static int n;
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
BigInteger account=new BigInteger("0");
n=input.nextInt();
m=input.nextInt();
for(int i=0;i
int[] que=new int[m];
BigInteger[][] map=new BigInteger[m+1][m+1];
map[0][0]=new BigInteger("0");
for(int j=0;j
que[j]=input.nextInt();
}
BigInteger number=new BigInteger("2");
BigInteger max=new BigInteger("0");
for(int k=0;k
for(int j=0;j<=k;j++){
BigInteger integer1=number.multiply(new BigInteger(""+que[k-j]));
BigInteger integer2=number.multiply(new BigInteger(""+que[m-j-1]));
integer1=integer1.add(map[k-j][j]);
integer2=integer2.add(map[k-j][j]);
if(map[k-j+1][j]==null||integer1.compareTo(map[k-j+1][j])>0) {
map[k-j+1][j] = integer1;
}
if(map[k-j][j+1]==null||integer2.compareTo(map[k-j][j+1])>0){
map[k-j][j+1]=integer2;
}
}
number=number.multiply(new BigInteger("2"));
}
for(int j=0;j
if(map[m-j][j].compareTo(max)>0){
max=map[m-j][j];
}
}
account=account.add(max);
}
System.out.println(account.toString());
}
}
矩阵游戏java_矩阵取数游戏JAVA题解相关推荐
- 【区间DP+高精】codevs1166 矩阵取数游戏题解
转自: [ametake版权所有]http://blog.csdn.net/ametake欢迎来看 http://blog.csdn.net/ametake/article/details/47664 ...
- 【日常学习】【区间DP+高精】codevs1166 矩阵取数游戏题解
题目来自NOIP2007TG3 如果在考场上我现在已经歇菜了吧 今天一整天的时间全部投在这道题上,收获不小. 先上题目 题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏 ...
- 【每日DP】day 10、P1005 矩阵取数游戏【区间DP+高精(python)】难度⭐⭐⭐★
P1005 矩阵取数游戏 输入 2 3 1 2 3 3 4 2 输出 82 说明/提示 NOIP 2007 提高第三题. 数据范围: 60%60\%60% 的数据满足:1≤n,m≤301\le n,m ...
- P1005 矩阵取数游戏(__int128模板/简单dp)
转跳P1005 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n \times mn×m 的矩阵,矩阵中的每个元素 a_{i,j}a i,j 均为非负整数.游戏规则如下: 每次取数时 ...
- 【每日一题】7月10日精讲—矩阵取数游戏
来源:牛客网: 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld ...
- 洛谷1005 【NOIP2007】矩阵取数游戏
问题描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 【codevs1166】【noip07TG】矩阵取数游戏,新的开始
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [问题描述] 帅帅经 ...
- 洛谷P1005 矩阵取数游戏 ACM 大数+区间dp
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
- 【NOIP2007提高组】矩阵取数游戏
题目背景 NOIP2007提高组试题3. 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n*m 的矩阵,矩阵中的每个元素 aij 均为非负整数.游戏规则如下: 1.每次取数时须从每行各取 ...
最新文章
- (转)线段树的区间更新
- python升级或者其他原因把yum搞坏了
- rpm如何卸载mysql_Linux下卸载和安装MySQL[rpm包]
- 如何在面试中通过工厂模式来给自己加分?逆袭面经分享
- [css] 请举例说明css有哪些不可继承的属性?
- 妈的我好像发现是哪出问题了
- linux 内核4.12,Linux Kernel 4.12 发布,最新的稳定版内核
- Windows 下命令行修改文件夹的控制权限 Cacls
- wpf silverlight的Behavior
- django1.6 mysql_如何在Django1.6结合Python3.4版本中使用MySql
- 使用ORL人脸库,通过GRNN网络和HOG特征提取的人脸识别算法matlab仿真
- 面向对象编程三大特性------封装、继承、多态
- python---字符串的拼接、去重、反转、字母花样排序、单词出现判断、统计文件特定单词频率lambda、硬盘容量、列表转字符串
- 【微信小程序更改appid失败】微信小程序修改appid一直失败报错tourist appid解决办法
- 分拣外观残缺的机器人_基于机器视觉的垃圾分拣机器人设计
- 幽默故事:1、我喜欢的女神;2、农村淑女(木子家原创)
- 解密Kerberos流量
- ios7新特性--4
- 在腾讯云中配置服务器外网可以访问
- php randomcode 函数,MyRandomCode.php