2021-09-10 P1270 “访问”美术馆 P3360 偷天换日

DP 学习

第一道题 luoguP1270
直接看题可以看出这是一道关于树的题
我们因为在学DP所以这是一道树形DP 根据题目要在给定时间内求出最大可得价值(偷最多的画)
我们考虑是否可以分出子问题,子问题如何求解,子问题如何转移
也就是要尝试用DP求解
f[i][j] 去表示在i点下用j时间可获得的最大价值
我们考虑转移

  • 对于叶子节点 我们取最小的可拿的画与已有的画
  • 对于非叶子节点 我们要分配给左右儿子时间,取最大值

这题的读入较麻烦,我们写一个dfs()去读入
顺便建成一棵树
然后遍历转移
最后的答案为f[1][n]

/***********************************************************
  > File Name: LGP1270.cpp
  > Author: lan_m
  > QQ: 2867930696
  > Created Time: 2021/9/10 7:41:59
  > Modified Time:2021/9/10 7:41:59
  > fighting for night
 *******************************************************/

#include <bits/stdc++.h>

using namespace std;
const int N = 150;
int n;
int tot;
int tim[N];
int val[N];

void dfs(int x) {
	scanf("%d%d",&tim[x],&val[x]);
	tim[x] *= 2;
	if(val[x] == 0) {
		dfs(x<<1);dfs(x<<1|1);
	}
	return ;
}

int f[150][620];

void deal(int x,int sum) {
	if(f[x][sum] > 0 || sum == 0) return ;
	if(val[x]) {
		f[x][sum] = min(val[x],(sum - tim[x])/5);
		return;
	}
	for (int i = 0;i <= sum - tim[x];i ++) {
		deal(x<<1,i);
		deal(x<<1|1,sum - i - tim[x]);
		f[x][sum] = max(f[x][sum],f[x<<1][i] + f[x<<1|1][sum - i - tim[x]]);
	}
}

int main(){
	scanf("%d",&n);n --;
	dfs(1);
	deal(1,n);
	printf("%d",f[1][n]);
	return 0;
}

另一道题luoguP3360
我们瞄一眼题,可以看出和上一题区别。
只加了偷价值为W的画用了C秒 这是一个背包,所以我们要在上一个代码中加点东西
除读入外,我们还要在叶子结点上做一个背包

/***********************************************************
  > File Name: LGP3360.cpp
  > Author: lan_m
  > QQ: 2867930696
  > Created Time: 2021/9/10 9:03:49
  > Modified Time:2021/9/10 9:03:49
  > fighting for night
 *******************************************************/

#include <bits/stdc++.h>

using namespace std;

const int N = 600;
int n;
int tot;
int tim[N];
int val[N];

inline void read(int &x){
	char ch=getchar();bool t=0;
	for (;!isdigit(ch);ch=getchar())if(ch == '-')t = 1;
	for (x=0;isdigit(ch);ch=getchar())x = x * 10 + ch - '0';
	if(t)x=-x;
}

struct node{
	int w,c;
}tp[N][40];

void init(int x){
	read(tim[x]);tim[x]<<=1;
	read(val[x]);
	if( val[x] == 0 ){
		init(x<<1);init(x<<1|1);
	}
	else {
		for(int i = 1;i <= val[x];i ++) {
			read(tp[x][i].w);
			read(tp[x][i].c);
		}
	}
	return ;
}
int f[N][N];
int f2[N];
void dfs(int x,int ttt) {
	if(ttt == 0 || f[x][ttt]) return ;
	if( val[x] == 0 ){
		for (int i = 0;i <= ttt - tim[x];i ++) {
			dfs(x<<1,i);
			dfs(x<<1|1,ttt - tim[x] - i);
			f[x][ttt] = max(f[x<<1][i] + f[x<<1|1][ttt-tim[x] - i] , f[x][ttt]);
		}
	}
	else {
		// 背包 ------------------------------
		memset(f2,0,sizeof(f2));
		for (int i = 1;i <= val[x];i ++) {
			for (int j = ttt - tim[x];j >= tp[x][i].c;j --) {
				f2[j] = max(f2[j] , f2[j - tp[x][i].c] + tp[x][i].w);
			}
		}
		// ------------------------------------
		f[x][ttt] = f2[ttt - tim[x]];
	}
}

int main() {
	read(n);n --;
	init(1);
	dfs(1,n);
	printf("%d",f[1][n]);
	return 0;
}
内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值