垒骰子(爆搜/DP)

news2025/7/23 5:53:23

动态规划

    • 方格取数
    • 垒骰子

方格取数

题目描述

设有 N × N N \times N N×N 的方格图 ( N ≤ 9 ) (N \le 9) (N9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0 0 0。如下图所示(见样例):

A
 0  0  0  0  0  0  0  0
 0  0 13  0  0  6  0  0
 0  0  0  0  7  0  0  0
 0  0  0 14  0  0  0  0
 0 21  0  0  0  4  0  0
 0  0 15  0  0  0  0  0
 0 14  0  0  0  0  0  0
 0  0  0  0  0  0  0  0
                         B

某人从图的左上角的 A A A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B B B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0 0 0)。
此人从 A A A 点到 B B B 点共走两次,试找出 2 2 2 条这样的路径,使得取得的数之和为最大。

输入格式

输入的第一行为一个整数 N N N(表示 N × N N \times N N×N 的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的 0 0 0 表示输入结束。

输出格式

只需输出一个整数,表示 2 2 2 条路径上取得的最大的和。

样例 #1

样例输入 #1

8
2 3 13
2 6  6
3 5  7
4 4 14
5 2 21
5 6  4
6 3 15
7 2 14
0 0  0

样例输出 #1

67

在这里插入图片描述

注意这里需要分为 i和j 是否相等,如果不相等一定不在同一个格子中,那就可以取两次了,为什么可以优化成三维,是因为如果走的次数是固定的,横坐标和纵坐标的和事固定的(行数+列数)。
注意,有了步数这一实际意义(大于等于0)和 步数与行数之间的约束(后者必须小于前者),循环的嵌套顺序和行数循环终止条件要注意

#include <iostream>
using namespace std;
//#define int long long int
const int N=10;
int a[N][N];
int dp[N][N][N][N];
int n,x,y,s;
int get_max(int u,int v,int o,int p){
	return max(max(u,v),max(o,p));
}
signed main(int argc, char** argv) {
	cin>>n;
	while(cin>>x>>y>>s){
		if(!x&&!y&&!s)break;
		a[x][y]=s;
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				for(int l=1;l<=n;l++){
					dp[i][j][k][l]=get_max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1])+a[i][j]+a[k][l];
//			两个人一步有四种结果
					if(i==k&&j==l)dp[i][j][k][l]-=a[i][j];
				}
			}
		}
	}
	cout<<dp[n][n][n][n];
	return 0;
}

#include <iostream>
using namespace std;
//#define int long long int
const int N=10;
int a[N][N];
int dp[N][N][N*2];
int n,x,y,s;
int get_max(int u,int v,int o,int p){
	return max(max(u,v),max(o,p));
}
signed main(int argc, char** argv) {
	cin>>n;
	while(cin>>x>>y>>s){
		if(!x&&!y&&!s)break;
		a[x][y]=s;
	}
	dp[1][1][0]=a[1][1];//初始化
	for(int k=1;k<=(n-1)*2;k++){//已经走了多少步(两个人是同时走一步)
	for(int i=1;i<=min(k+1,n);i++){
		for(int j=1;j<=min(k+1,n);j++){
			
					dp[i][j][k]=get_max(dp[i-1][j][k-1],dp[i-1][j-1][k-1],dp[i][j][k-1],dp[i][j-1][k-1])+a[i][k+2-i]+a[j][k+2-j];
//			两个人一步有四种结果 p1向下p2向右,都向下,都向右,p1向右p2向下
					if(i==j)dp[i][j][k]-=a[i][k+2-i];
//			m行n列总共 m-1+n-1步
//			cx行,cx=i,cy列 cx-1+cy-1=k步 cy=k+2-cx	
			}
		}
	}

	cout<<dp[n][n][(n-1)*2];
	return 0;
	
}
//1 1 1
//2 2 3 
//2 3 4

垒骰子

在这里插入图片描述

在这里插入图片描述
爆搜

#include <iostream>
using namespace std;
#define int long long int
const int mod=1e9+7;
const int N=10;
int m,n,x,y;
int back[7];
bool conflict[40][40];
int dfs(int u,int cnt){
	if(cnt==n+1){
		return 1;
	}
	int ans=0;
	for(int down=1;down<=6;down++){//枚举骰子底部的数字
		if(conflict[u][down])continue;
		ans=(ans+dfs(back[down],cnt+1))%mod;
	}
}
int quickpow(int b,int e){
	b%=mod;
	int res=1;
	while(e){
		if(e&1)res=res*b%mod;
		b=b*b%mod;
		e=e>>1;
	}
	return res;
}
signed main(int argc, char** argv) {
	back[1]=4;back[4]=1;
	back[2]=5;back[5]=2;
	back[3]=6;back[6]=3;
	cin>>n>>m;
	
	for(int i=0;i<m;i++){
		cin>>x>>y;
		conflict[x][y]=true;
		conflict[y][x]=true;
	}
	int res=0;
	for(int down=1;down<=6;down++){
		res=(res+dfs(back[down],2))%mod;
	}
	res=res*quickpow(4,n)%mod;
	cout<<res;
	return 0;
	
}


在这里插入图片描述
在这种解题方式上用快速幂有些多余。分枝过多的递归当n=100时,几乎不能在题目规定时间内计算出来。当n<100时,通过累乘的方式将4一次、一次乘给ans,这并不会对程序的效率造成很大影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT助力校招----面试问题分享(一)

1 ChatGPT每日一题&#xff1a;期望薪资是多少 问题&#xff1a;面试官问期望薪资是多少&#xff0c;如何回答 ChatGPT&#xff1a;当面试官问及期望薪资时&#xff0c;以下是一些建议的回答方法&#xff1a; 1、调查市场行情&#xff1a;在回答之前&#xff0c;可以先调查一…

Python基础之while循环

一&#xff1a;while语法 while 条件:代码1 代码2 代码3....while的运行步骤&#xff1a; 步骤1&#xff1a;如果条件为真&#xff0c;那么依次执行&#xff1a;代码1、代码2、代码3、...... 步骤2&#xff1a;执行完毕后再次判断条件,如果条件为True则再次执行&#…

通用缓存存储设计实践

目录介绍 01.整体概述说明 1.1 项目背景介绍1.2 遇到问题记录1.3 基础概念介绍1.4 设计目标1.5 产生收益分析 02.市面存储方案 2.1 缓存存储有哪些2.2 缓存策略有哪些2.3 常见存储方案2.4 市面存储方案说明2.5 存储方案的不足 03.存储方案原理 3.1 Sp存储原理分析3.2 MMKV存储…

【数据挖掘】4、关联分析:Apriori、FP-Growth 算法、买面包是否也爱买啤酒

文章目录一、概念1.1 支持度1.2 置信度1.3 提升度二、Apriori 算法2.1 频繁项集的定义2.2 算法工作原理三、FP-Growth 算法3.1 算法步骤3.1.1 创建项头表3.1.2 构造 FP 树3.1.3 通过 FP 树挖掘频繁项集3.2 手动推导3.2.1 计算单一项的频率&#xff08;支持度计数&#xff09;3.…

shusheng007编程手记

[版权申明] 非商业目的注明出处可自由转载 出自&#xff1a;shusheng007 文章目录概述工具篇IntelliJ IDEA在Idea中下载源码时&#xff0c;报无法下载源码PostmanPost请求被识别成Get请求Linux开启关闭防火墙开放端口关闭端口如何修复磁盘Nginx如何使用docker来安装Nginx概述 …

VMware虚拟网络编辑桥接/NAT/仅主机模式详解

VMware虚拟网络编辑 安装VMware后 默认虚拟网络设置&#xff1a; VMnet0&#xff1a;桥接模式 VMnet1&#xff1a;仅主机 VMnet8&#xff1a;NAT模式 可以打开VMware的虚拟网络适配器查看 NAT模式 NAT模式借助虚拟NAT设备和虚拟DHCP服务器&#xff0c;使得虚拟机可以联网…

掌握Swagger3自动化生成接口文档完成后端提效

文章目录OpenApi规范Swagger3快速上手Swagger3使用Swagger3.x常用注解讲解和配置Api 模块配置ApiOperation 接口配置ApiParam 方法参数配置ApiIgnore 忽略此接口ApiModel()和ApiModelProperty()ApiResponse描述接口响应注意可能出现的问题OpenApi规范 开放API规范&#xff08;…

Java内存屏障简介

简介 内存屏障是插入两个CPU命令之间的命令&#xff0c;禁止处理器命令的重新排序(如屏障)&#xff0c;以确保有序性。此外&#xff0c;为了达到屏障的效果&#xff0c;在处理器写入、读取值之前&#xff0c;将主机的值写入缓存&#xff0c;清空无效的队列&#xff0c;保障可见…

C++函数重载及其背后的原理

写在前面 先说说我的状态吧&#xff0c;五一假期五天假&#xff0c;这些天都在玩&#xff0c;很少学习&#xff0c;我不是后悔&#xff0c;也没必要&#xff0c;本来假期就是为了让自己放松.我唯一要反思看到别人在学,我心里也想学但是却做不到,这是我的缺点,后面我会克服的.尽…

运维提质增效,有哪些办法可以做

凡是代码&#xff0c;难免有 bug。 开发者们的日常&#xff0c;除了用一行行代码搭产品外&#xff0c;便是找出代码里的虫&#xff0c;俗称 debug。 随着移动互联网的快速发展&#xff0c;App 已经成为日常生活中不可或缺的一部分。但是在开发者/运维人员的眼里简直就是痛苦的…

使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法

使用enrichKEGG做通路富集分析时&#xff0c;一直报错&#xff1a;显示No gene can be mapped....k <- enrichKEGG(gene gene, organism "hsa", pvalueCutoff 1, qvalueCutoff 1)但是之前用同样的基因做分析是能够成功地富集到通路&#xff0c;即便是网上的数据…

Appium+Python连接真机、跳过登录页、Unexpected error while obtaining UI hierarchy问题

Appium连接真机 使用数据线连接电脑&#xff0c;然后选择文件传输方式 打开手机设置拉至底部&#xff0c;点击关于手机&#xff0c;连续点击7次版本号打开开发者模式 点击设置中的系统与更新&#xff0c;找到开发者选项----> 打开USB调试即可 在终端中输入adb devices确定…

c语言经典例题-数组的使用

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 选择法排序&#xff1a; 题目&#xff1a; 本关任务&#xff1a;使用选择法排序&#xff08;http://t.csdn.cn/…

统计学 一元线性回归

统计学 一元线性回归 回归&#xff08;Regression&#xff09;&#xff1a;假定因变量与自变量之间有某种关系&#xff0c;并把这种关系用适当的数学模型表达出来&#xff0c;利用该模型根据给定的自变量来预测因变量 线性回归&#xff1a;因变量和自变量之间是线性关系 非线…

看板组件:Bryntum Task Board JS 5.3.0 Crack

一个超级灵活的看板组件&#xff0c;Bryntum Task Board 是一个灵活的看板 Web 组件&#xff0c;可帮助您可视化和管理您的工作。 功能丰富 任务板非常灵活&#xff0c;允许您完全自定义卡片、列和泳道的渲染和样式。借助丰富的 API&#xff0c;您甚至可以在运行时打开或关闭功…

MSE 诊断利器上线

作者&#xff1a;子葵 背景 在日常开发和生产环境中&#xff0c;可能会遇到由于网络或者其他因素导致客户端连接 MSE 集群出现异常&#xff0c;此时需要排查集群以及客户端状态&#xff0c;通常需要通过文档查询对应的异常解释来定位问题&#xff0c;排查问题的链路比较长&am…

JNI内通过参数形式从C/C++中传递string类型数据至Java层

目录 0 前言 1 string类型参数形式传值 2 测试和结果 0 前言 类似之前我写过的两篇文章&#xff1a;一篇介绍了在JNI中基础类型int的传值方式&#xff1b;一篇详细梳理了在JNI层中多维数组的多种传值方式。 JNI内两种方式从C/C中传递一维、二维、三维数组数据至Java层详细…

如何实现接口幂等性

1 什么是幂等 幂等操作的特点是一次或者任意多次执行所产生的影响均与一次执行的影响相同&#xff0c;不会因为多次的请求而产生不一样的结果。换句话说&#xff0c;就是我使用相同的请求参数&#xff0c;去请求同一个接口&#xff0c;不管请求多少次获取到的响应数据应该是一…

JUC并发编程——Park Unpark

一、Park & Unpark 1.1 基本使用 它们是 LockSupport 类中的方法 // 暂停当前线程 LockSupport.park(); // 恢复某个线程的运行 LockSupport.unpark(暂停线程对象)先 park 再 unpark import lombok.extern.slf4j.Slf4j; import java.util.concurrent.locks.LockSuppor…

Baumer工业相机堡盟相机如何使用PnPEventHandler实现相机掉线自动重连(C++新)

项目场景&#xff1a; Baumer工业相机堡盟相机传统开发包BGAPI SDK进行工业视觉软件整合时&#xff0c;常常需要将SDK中一些功能整合到图像处理软件中&#xff0c;方便项目的推进使用&#xff1b; 在项目的图像处理任务中&#xff0c;可能会因为一些硬件比如线缆网卡的原因导…