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

NOIP2007提高组.矩阵取数游戏

题目

492. 矩阵取数游戏
在这里插入图片描述

思路

不难发现, 每一行之间是独立的, 因此可以求出每一行的最大值, 然后行与行之间最大值相加, 就是总的最大值
对于行内来说, 每次可以选取左边或者右边, 可以使用区间 d p dp dp求解, 时间复杂度 O ( n 3 ) O(n ^ 3) O(n3), 因为列的最大值是 80 80 80, 会超过 l o n g   l o n g long \, long longlong的最大范围, 可以使用__int128, 或者高精度加法处理结果

*被坑了, 计算 2 k 2 ^ k 2k时也要转为 i 128 i128 i128

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

typedef __int128 i128;
const int N = 90;

int n, m;
int w[N][N];
i128 f[N][N];

ostream &operator<< (ostream &out, i128 val) {
	if (val == 0) {
		out << 0;
		return out;
	}
	vector<int> vec;
	while (val) vec.push_back(val % 10), val /= 10;
	while (!vec.empty()) out << vec.back(), vec.pop_back();
	return out;
}

i128 solve(int w[]) {
	memset(f, 0, sizeof f);

	for (int len = 1; len <= m; ++len) {
		for (int i = 1; i + len - 1 <= m; ++i) {
			int j = i + len - 1;
			int cnt = m - j + i;
			if (len == 1) {
				f[i][j] = (i128) w[i] * (1 << cnt);
				continue;
			}
			f[i][j] = max(f[i + 1][j] + (i128) w[i] * (1 << cnt), f[i][j - 1] + (i128) w[j] * (1 << cnt));
		}
	}

	return f[1][m];
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			cin >> w[i][j];
		}
	}

	i128 res = 0;
	for (int i = 1; i <= n; ++i) res += solve(w[i]);

	cout << res << "\n";
	return 0;
}

A C AC AC代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

typedef __int128 i128;
const int N = 90;

int n, m;
int w[N][N];
i128 f[N][N];

ostream &operator<< (ostream &out, i128 val) {
	if (val == 0) {
		out << 0;
		return out;
	}
	vector<int> vec;
	while (val) vec.push_back(val % 10), val /= 10;
	while (!vec.empty()) out << vec.back(), vec.pop_back();
	return out;
}

i128 solve(int w[]) {
	memset(f, 0, sizeof f);

	for (int len = 1; len <= m; ++len) {
		for (int i = 1; i + len - 1 <= m; ++i) {
			int j = i + len - 1;
			int cnt = m - j + i;
			if (len == 1) {
				f[i][j] = (i128) w[i] * ((i128) 1 << cnt);
				continue;
			}
			f[i][j] = max(f[i + 1][j] + (i128) w[i] * ((i128) 1 << cnt), f[i][j - 1] + (i128) w[j] * ((i128) 1 << cnt));
		}
	}

	return f[1][m];
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			cin >> w[i][j];
		}
	}

	i128 res = 0;
	for (int i = 1; i <= n; ++i) res += solve(w[i]);

	cout << res << "\n";
	return 0;
}
http://www.dtcms.com/a/98511.html

相关文章:

  • 思维链技术(Chain-of-Thought, CoT)
  • 双卡 RTX 5090 深度体验:AI 推理框架选择与性能限制实测
  • HCIP(RSTP+MSTP)
  • 【STL】list
  • React程序打包与部署
  • JAVASE-day14
  • 蓝桥杯备考:多米诺骨牌
  • 【Linux】GDB调试指南
  • 基于YALMIP+CPLEX的带储能微电网调度问题最优求解matlab仿真
  • 提示词工程(Prompt Engineering):释放AI潜能的“语言编程”
  • #CX# UVM中的virtual sequence 和 virtual sequencer 的用途
  • 【Kafka】从理论到实践的深度解析
  • pytorch中dataloader自定义数据集
  • Java/Scala是什么
  • 解决由于中文路径无法安装软件的问题--例如postersql
  • 数据化管理(一)---什么是数据化管理
  • 模拟集成电路设计与仿真 : Memory
  • 北斗导航 | 中国北斗卫星导航系统的发展历程——“三步走”战略:背景,信号频点,调制方式,短报文,等
  • Linux交叉编译第三方库,C语言调用第三方库
  • 资产收益数据处理与分析
  • RK3568 GPIO子系统
  • 自然语言模型的演变与未来趋势:从规则到多模态智能的跨越
  • 混合知识表示系统框架python示例
  • PyQt6实例_批量下载pdf工具_主线程停止线程池
  • PERL开发环境搭建>>Windows,Linux,Mac OS
  • 【JavaScript】九、JS基础练习
  • torch.tensor 用法
  • OpenAI API - 快速入门开发
  • 链表(C++)
  • WPF 自定义行为AssociatedObject详解