首页 > 其他分享 >2024.6 -> 做题记录与方法总结

2024.6 -> 做题记录与方法总结

时间:2024-06-15 13:21:47浏览次数:11  
标签:总结 ch 2024.6 记录 int res ll 轮廓线 now

2024/6/15

1.P4363 [九省联考 2018] 一双木棋 chess

经典轮廓线dp
使用的关键在于发现状态数并不多,用 \(n\) 进制数来表现轮廓的状态

\(dp\) 的 转移 和 轮廓线 息息相关

img

如图,蓝色轮廓线状态只能转移到含一个紫色的状态
因为 $ 1 \leq n,m \leq 10$ 用 \(11\) 进制压缩状态就可以了

轮廓线状态压缩:

ll zip(int *now){
	ll res = 0;
	for(int i = n;i>=1;i--) res = res * 11 + now[i];
	return res; 
}

void unzip(ll S,int *now) {
	for(int i = 1;i<=n;i++) {
		now[i] = S % 11;
		S /= 11; 
	}
}	

\(AC-code\):

#include<bits/stdc++.h>
using namespace std;

int rd() {
	int x = 0, w = 1;
	char ch = 0;
	while (ch < '0' || ch > '9') {
		if (ch == '-') w = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = x * 10 + (ch - '0');
		ch = getchar();
	}
	return x * w;
}

void wt(int x) {
	static int sta[35];
	int f = 1;
	if(x < 0) f = -1,x *= f;
	int top = 0;
	do {
		sta[top++] = x % 10, x /= 10;
	} while (x);
	if(f == -1) putchar('-');
	while (top) putchar(sta[--top] + 48);
}

typedef long long ll;

int n,m;
int a[11][11],b[11][11];

unordered_map<ll,ll> dp;

ll zip(int *now){
	ll res = 0;
	for(int i = n;i>=1;i--) res = res * 11 + now[i];
	return res; 
}

void unzip(ll S,int *now) {
	for(int i = 1;i<=n;i++) {
		now[i] = S % 11;
		S /= 11; 
	}
}	

const ll inf = 1e9;

ll dfs(ll S){
	if(dp.count(S)) return dp[S];
	int size = 0;
	int *now = new int[11];
	unzip(S,now);
	for(int i = 1;i<=n;i++) size += now[i];
	int re = (size & 1) ? inf:-inf;
	for(int i = 1;i<=n;i++) {
		if((i == 1 && now[i] < m) || (i != 1 && now[i] < now[i-1])) {
			now[i]++;
			if((size & 1)) re = min((ll)re,dfs(zip(now)) - b[i][now[i]]);
			else re = max((ll)re,dfs(zip(now)) + a[i][now[i]]);
			now[i]--;
		}
	}
	delete now;
	return dp[S] = re;
}

signed main() {
	n = rd(),m = rd();
	for(int i = 1;i<=n;i++) 
		for(int j = 1;j<=m;j++) 
			a[i][j] = rd();
	for(int i = 1;i<=n;i++) 
		for(int j = 1;j<=m;j++) 
			b[i][j] = rd();

	ll ed = 0;
	for(int i = 1;i<=n;i++) ed = ed * 11 + m;
	dp[ed] = 0;
	ll ans = dfs(0);
	wt(ans);
	return 0;
}

标签:总结,ch,2024.6,记录,int,res,ll,轮廓线,now
From: https://www.cnblogs.com/WG-MingJunYi/p/18249208

相关文章

  • 超详细的glm-4微调过程和代码之最强落地经验总结
    GLM-4是智谱AI在2024年推出的新一代基座大语言模型,该模型在整体性能上相比上一代有显著提升,接近GPT-4的水平。GLM-4具有多项先进特性,包括更强的多模态处理能力、支持更长上下文输入(最长可达128k)等,展示了国产大模型在技术和创新应用方面的最新进展。微调(Fine-tuning)是自然语言......
  • 关于我转生变成史莱姆这档事 第三季[追更记录]
    第48.5集(第00集)更新3月30日闲话:迪亚波罗日记第49集(第01集)更新4月05日恶魔与谋策第50集(第02集)更新4月12日圣人的意图第51集(第03集)更新4月19日和平的日子第52集(第04集)更新4月26日各自的职责第53集(第05集)更新5月03日两翼会议第54集(第06集)更......
  • 2022年9月3号 辅导的大一新生自学C语言,答疑解惑聊天记录。
    C调战士......
  • 异常处理记录
    异常处理过程:当我们遇到异常时,我们首先需要把当前程序P的状态保存起来,而后跳到异常处理程序进行诊断。这里我们从指令集状态机S={<R,M>}的视角来讨论咯R为寄存器,M为内存。异常处理程序和P事两个不同的程序,它们使用不同的M,所以:只要异常处理程序不随意修改P的M,则不必进行实......
  • C# 访问修饰符总结
    C#共有五种访问修饰符,如下:访问修饰符 说明public 公有访问。不受任何限制。private 私有访问。只限于本类成员访问,子类,实例都不能访问。protected 保护访问。只限于本类和子类访问,实例不能访问。internal 内部访问。只限于......
  • 【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configurati
    问题描述如果在使用.NET代码对AADJWTToken进行验证时候,如果遇见无法访问 Unabletoobtainconfigurationfrom:'https://login.partner.microsoftonline.cn/<commonoryourtenantid>/v2.0/.well-known/openid-configuration‘,可以配置 HttpClientHandler.Proxy代理。......
  • 持续总结中!2024年面试必问 20 道并发编程面试题(五)
    上一篇地址:持续总结中!2024年面试必问20道并发编程面试题(四)-CSDN博客九、什么是可重入锁(ReentrantLock)?可重入锁,也称作递归锁或再入锁,是一种同步机制,用于在多线程编程中控制对共享资源的访问。这种锁允许同一个线程多次获取同一个锁,而不会导致死锁。可重入锁通常由编程语言......
  • 持续总结中!2024年面试必问 20 道并发编程面试题(四)
    上一篇地址:持续总结中!2024年面试必问20道并发编程面试题(三)-CSDN博客七、请解释什么是原子操作。原子操作(AtomicOperation)是指在多线程环境中,一个操作或者一系列操作,要么完全执行,要么完全不执行,中间不会有其他线程的干扰。这意味着原子操作在执行过程中不会被其他线程中断,......
  • Superset二次开发之基于GitLab OpenAPI 查询项目的提交记录中修改的文件
    背景:Superset二次开发,在处理版本升级的过程中,需要手动迁移代码,如何在Superset项目众多的文件中,记录修改过的文件,迁移代码时只需重点关注这些文件修改的内容即可,但是针对项目中多次的commit信息,每个commit又涉及不同的文件,如何快速梳理出这些二开工作中修改的文件,是我们......
  • yolov1总结
    YOLO-V1的核心思想:利用整张图作为网络的输入,将目标检测作为回归问题解决,直接在输出层回归预选框的位置及其所属的类别。YOLO和RCNN最大的区别就是去掉了RPN网络,去掉候选区这个步骤以后,YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全连接。单看网络结构的话,和普通的CNN......