首页 > 其他分享 >day1

day1

时间:2022-12-31 23:11:45浏览次数:57  
标签:dian head int tot day1 edge dp

因为noip寄了,所以非常伤心,准备从2023开始加油!刷题!
今天是洛谷P1267
首先,枚举根节点,下一次选的点的值在1~4nn中,每选一个点,在该子树中的选点范围就会缩小,此时我们考虑用搜索,但它应该过不了,再考虑dp,f[i][j][k]表示以i为子树的根节点,以[j,k]为子树的选数范围,但ijk=(4nn)^3,依然过不了,但是对于一个以i根节点的子树来说,它选数范围的左端点或右端点一定是i的父结点的值,且每一个结点的父节点的可能性只有三个,因此记搜加map可过。
代码:

#include<iostream>
#include<map>
#include<cmath>
#define int long long
using namespace std;
int n;
struct node{
	int to;
	int nxt;
}edge[10010];
int head[4010],tot;
void addedge(int u,int v){
	edge[++tot].to=v;
	edge[tot].nxt=head[u];
	head[u]=tot;
}
int dian[4010];
map<pair<int,pair<int,int> >,int> mp;
int f[5][4][20];
int dfs(int u,int l,int r){
	if(mp[make_pair(u,make_pair(l,r))]!=0)return mp[make_pair(u,make_pair(l,r))];
	int zuo=0;
	int you=0;
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].to;
		if(dian[v]>=l&&dian[v]<dian[u]){
			zuo=max(zuo,dfs(v,l,dian[u]-1));
		}
		if(dian[v]>dian[u]&&dian[v]<=r){
			you=max(you,dfs(v,dian[u]+1,r));
		}
	}
	return mp[make_pair(u,make_pair(l,r))]=1+zuo+you;
}
signed main(){
	cin>>n;
	for(int i=1;i<=4;i++){
		for(int j=1;j<=n*n;j++){
			cin>>dian[(i-1)*n*n+j];
		}
		for(int j=1;j<=n*n;j++){
			if((int)(sqrt(j))*(int)(sqrt(j))!=j){
				addedge((i-1)*n*n+j,(i-1)*n*n+j+1);
			}
			if((int)(sqrt(j-1))*(int)(sqrt(j-1))!=j-1){
				addedge((i-1)*n*n+j,(i-1)*n*n+j-1);
			}
			int heng=sqrt(j-1)+1;
			if((heng+j)%2==0){
				if(heng<n){
					addedge((i-1)*n*n+j,(i-1)*n*n+j+2*heng);
				}
			}
			else{
				if(heng>1){
					addedge((i-1)*n*n+j,(i-1)*n*n+j-2*heng+2);
				}
			}
		}
		for(int j=0;j<=n;j++){
			f[i][2][j]=(i-1)*n*n+j*j;
		}
		for(int j=1;j<=n;j++){
			f[i][1][j]=f[i][2][j-1]+1;
		}
		for(int j=1,k=f[i][1][n];j<=n;j++,k+=2){
			f[i][3][j]=k;
		}
	}
	for(int i=1;i<=n;i++){
		addedge(f[1][2][i],f[2][1][i]);
		addedge(f[2][1][i],f[1][2][i]);
		addedge(f[1][1][i],f[3][2][i]);
		addedge(f[3][2][i],f[1][1][i]);
		addedge(f[3][1][i],f[2][2][i]);
		addedge(f[2][2][i],f[3][1][i]);
		addedge(f[2][3][i],f[4][2][i]);
		addedge(f[4][2][i],f[2][3][i]);
	}
	for(int i=1,j=n;i<=n;i++,j--){
		addedge(f[1][3][i],f[4][1][j]);
		addedge(f[4][1][j],f[1][3][i]);
		addedge(f[3][3][i],f[4][3][j]);
		addedge(f[4][3][j],f[3][3][i]);
	}
	int ans=0;
	for(int i=1;i<=4*n*n;i++){
		ans=max(ans,dfs(i,1,4*n*n));
	}
	cout<<ans;
	return 0;
}

我对搜索和dp有一些小小的想法,搜索复杂度爆炸是一个状态询问多次,dp复杂度爆炸是询问许多无用状态,个人认为记搜加map可以解决,当然,dp经过一定处理也可以完成。除此以外,dp的状态查询大部分都是有一定顺序的,若是排不出顺序的,可以用搜索解决。

标签:dian,head,int,tot,day1,edge,dp
From: https://www.cnblogs.com/z-2-we/p/17017541.html

相关文章

  • day12-功能实现11
    家居网购项目实现011以下皆为部分代码,详见https://github.com/liyuelian/furniture_mall.git27.功能25-事务管理27.1下订单问题思考在生成订单的功能中,系统会去同时......
  • day13
    ##循环结构![image-20221229174904825](C:\Users\biao\AppData\Roaming\Typora\typora-user-images\image-20221229174904825.png)![image-20221229175121292](C:\Users......
  • day11-功能实现10
    家居网购项目实现010以下皆为部分代码,详见https://github.com/liyuelian/furniture_mall.git24.bugFix-添加购物车按钮动态处理24.1需求分析/图解如某个家居的库存......
  • day11-分类和static
    1.案例驱动模式1.1案例驱动模式概述(理解)通过我们已掌握的知识点,先实现一个案例,然后找出这个案例中,存在的一些问题,在通过新知识点解决问题1.2案例驱动模式的好处......
  • day10Git
    1.Git介绍1.1版本控制(理解)无论是代码编写,还是文档编写,我们都会遇到对文档内容反复修改的情况1.2开发中存在的问题(理解)程序员小明负责的模块就要完成了,就在即将提......
  • day1
    本人情况:双非研一电子信息专业,想跳ic验证。每天都记录一下自己学了什么,经历了什么。 先确认一下ic验证学习的基本流程。看了许多学习推荐,一般情况为:1.数电;2.Verilo......
  • 刷刷刷Day1| LeetCode704. 二分查找,27. 移除元素
    704.二分查找LeetCode题目要求给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。......
  • day10-功能实现09
    家居网购项目实现09以下皆为部分代码,详见https://github.com/liyuelian/furniture_mall.git21.功能20-修改购物车21.1需求分析/图解进入购物车页面,可以修改购买数......
  • Day1:计算机基础知识
    标题井号空格标题几个井号代表几级标题字体两边加一个星号两边加两个星号两边加三个星号两边加两个波浪号分割线三个-或者*分割线引用大于号引用图片所有......
  • AT_iroha2019_day1_c Halcyon 翻译
    题目传送门题目描述HalcyonDays是\(12\)月\(N\)日的冬至和之前的\(1\)个星期。给出冬至的日期\(N\),输出\(8\)天HalcyonDays的日期。输入格式\(1\)行,输......