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

[NOIP2007]矩阵取数游戏

点我写题

题目描述 

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下:
1.每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素;
2.每次取走的各个元素只能是该元素所在行的行首或行尾;
3.每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值 * 2i,其中i表示第i次取数(从1开始编号);
4.游戏结束总得分为m次取数得分之和。
帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。

示例1

输入

复制

2 3
1 2 
3 4 2

输出

复制

82

思路:容易观察到,每列可以单独考虑,即局部最优解能构成全局最优解,设dp[i][t][k]表示,n*m的矩阵中,第i行元素,到第t轮选元素,前面选了k个的最大值。

转移:考虑当前轮是选前面的还是选后面的,选前面的,就是dp[i][t][k]=dp[i][t-1][k-1]+a[k]*(2^t),选后面的dp[i][t][k]=dp[i][t-1][k]+a[m-(t-k)+1]*(2^t)(即前面选k个后面就该选了t-k个了)。

ps:这里还硬缝合了个高精度,但是java用BigInteger就能过,java果然是世界上最好的语言,(bushi~)。

纠错:牛客空间比较大三维dp能过,但是洛谷只能俩维,把没用的那维去掉就好了然后加个初始化。

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner s=new Scanner(System.in);int n=s.nextInt(),m=s.nextInt();int a[][]=new int [n+10][m+10];BigInteger mul[]=new BigInteger [m+10];mul[0]=BigInteger.valueOf(1);for(int i=1;i<=m;i++) mul[i]=mul[i-1].multiply(BigInteger.valueOf(2));for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) {a[i][j]=s.nextInt();}}BigInteger ans=BigInteger.valueOf(0);for(int i=1;i<=n;i++) {BigInteger res=BigInteger.valueOf(0);BigInteger dp[][]=new BigInteger [m+10][m+10];for(int j=0;j<=m;j++) {for(int k=0;k<=m;k++) {dp[j][k]=new BigInteger("0");}}for(int t=1;t<=m;t++) {for(int j=0;j<=t;j++) {dp[t][j]=dp[t-1][j].add(BigInteger.valueOf(a[i][m-(t-j)+1]).multiply(mul[t]));if(j>0) {BigInteger x=dp[t-1][j-1].add(mul[t].multiply(BigInteger.valueOf(a[i][j])));if(dp[t][j].compareTo(x)<0) dp[t][j]=x;}if(res.compareTo(dp[t][j])<0) res=dp[t][j];}}ans=ans.add(res);}System.out.print(ans+"\n");}}

http://www.lryc.cn/news/528399.html

相关文章:

  • 在Linux系统上安装.NET
  • PCB Editor层叠文件(Gerber文件输出-01)
  • labelimg闪退的解决办法
  • 【开源免费】基于Vue和SpringBoot的在线文档管理系统(附论文)
  • 数据库管理-第287期 Oracle DB 23.7新特性一览(20250124)
  • Golang :用Redis构建高效灵活的应用程序
  • 四层网络模型
  • CUDA学习-内存访问
  • 进程通讯——类型和发展
  • 在 Windows 11 中为 SMB 3.x 文件共享协议提供 RDMA 支持
  • C 标准库 - `<errno.h>`
  • 2025年01月28日Github流行趋势
  • 7. 马科维茨资产组合模型+金融研报AI长文本智能体(Qwen-Long)增强方案(理论+Python实战)
  • Android 启动流程
  • 庆祝2025到来:C++编程的新篇章
  • 基于STM32的智能家用温控器设计
  • 扣子平台音频功能:让声音也能“智能”起来。扣子免费系列教程(14)
  • Dismissible组件的用法
  • C语言--数据在内存中的存储
  • CPP-存储区域
  • 9.中断系统、EXTI外部中断
  • 新增文章功能
  • 《HelloGitHub》第 106 期
  • 使用Ollama 在Ubuntu运行deepseek大模型:以DeepSeek-coder为例
  • ROS应用之SwarmSim在ROS 中的协同路径规划
  • ARM64平台Flutter环境搭建
  • Maven运行任何命令都报错“Internal error: java.lang.ArrayIndexOutOfBoundsException”
  • doris: MAP数据类型
  • Gurobi基础语法之 LinExpr 类
  • 《Java核心技术 卷II》日期和时间API的时间线