[NOIP2007]矩阵取数游戏

点我写题

题目描述

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下:

1.每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素;

2.每次取走的各个元素只能是该元素所在行的行首或行尾;

3.每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值 * 2 i ,其中i表示第i次取数(从1开始编号);

4.游戏结束总得分为m次取数得分之和。

帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。

示例1

输入

复制

复制代码
2 3
1 2 
3 4 2

输出

复制

复制代码
82

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

转移:考虑当前轮是选前面的还是选后面的,选前面的,就是dpitk=dpit-1k-1+ak*(2^t),选后面的dpitk=dpit-1k+am-(t-k)+1*(2^t)(即前面选k个后面就该选了t-k个了)。

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

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

java 复制代码
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");
	}

}
相关推荐
奇牙coding7 分钟前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
tomwang032212 分钟前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!13 分钟前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
Lhappy嘻嘻20 分钟前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm
黄俊懿20 分钟前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
Rain的Java大神之路27 分钟前
别再死磕 MySQL 了:向量数据库与 RAG 生产落地实录(Java 工程师专场)
java·后端·面试
七夜zippoe28 分钟前
Spring AI 是什么?Java 工程师的 AI 开发第一站
java·人工智能·spring·ai·开发
2501_9269783331 分钟前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作
行者全栈架构师33 分钟前
【鸿蒙心迹】互动卡片全链路——把核心功能放到桌面(FormKit 实战)(HarmonyOS 7.x)
前端·算法·架构
是真的小外套38 分钟前
2023年软考中级信息安全工程师|选择题考点+5道案例分析真题解析(含答案)
java·服务器·网络