首页 > 其他分享 >Living-Dream 系列笔记 第81期

Living-Dream 系列笔记 第81期

时间:2024-10-09 20:23:40浏览次数:1  
标签:Living const cur int long vis 81 Dream dp

庆祝该系列突破 80 期!!!1

文中可能有彩蛋(

记忆化搜索

dp 的一种 dfs 实现。

P1434

令 \(dp_{i,j}\) 表示以 \((i,j)\) 结束的最长滑坡的长度。

答案:\(\max\{dp_{i,j}\}\)。

初始:\(dp_{i,j}=1\)。

转移:\(dp_{i,j}=dp_{x,y}+1\),其中 \((x,y)\) 为 \((i,j)\) 四个方向上的邻接点。

实现时枚举每个点进行记忆化搜索即可。

bad guy
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=5e2+5;
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
int r,c;
char mp[N][N];
bool vis[N][N];

int get(){
	int sum=0;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			if(mp[i][j]=='0'&&!vis[i][j])
				sum++;
	return sum;
}
void dfs(int x,int y){
	if(x<1||x>r||y<1||y>c||vis[x][y]||mp[x][y]!='0')
		return;
	vis[x][y]=1;
	for(int i=0;i<4;i++){
		int xx=x+dx[i],yy=y+dy[i];
		dfs(xx,yy);
	}
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>r>>c;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			cin>>mp[i][j];
	int ans=1e9;
	for(int i=1;i<=c;i++){
		dfs(1,i);
		dfs(r,i);
	}
	for(int i=1;i<=r;i++){
		dfs(i,1);
		dfs(i,c);
	}
	cout<<get();
	return 0;
}

P1506

从边缘每个点开始 flood-fill 即可,注意边上的点有可能不能作为源点。

xanny
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=5e2+5;
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
int r,c;
char mp[N][N];
bool vis[N][N];

int get(){
	int sum=0;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			if(mp[i][j]=='0'&&!vis[i][j])
				sum++;
	return sum;
}
void dfs(int x,int y){
	if(x<1||x>r||y<1||y>c||vis[x][y]||mp[x][y]!='0')
		return;
	vis[x][y]=1;
	for(int i=0;i<4;i++){
		int xx=x+dx[i],yy=y+dy[i];
		dfs(xx,yy);
	}
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>r>>c;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			cin>>mp[i][j];
	int ans=1e9;
	for(int i=1;i<=c;i++){
		dfs(1,i);
		dfs(r,i);
	}
	for(int i=1;i<=r;i++){
		dfs(i,1);
		dfs(i,c);
	}
	cout<<get();
	return 0;
}

P4017

令 \(dp_i\) 表示以 \(i\) 结尾的最长食物链的长度。

答案:所有出度为 \(0\) 的点 \(i\) 的 \(\sum dp_i\)。

初始:所有入度为 \(0\) 的点 \(i\) 有 \(dp_i=1\)。

转移:\(dp_i=dp_{cur}+1\)。

注意建反边,为了方便找转移点。

记搜的题目一般都是从终止节点开始 dfs,因此一般要建反边

you should see me in a crown
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=5e3+5;
const int MOD=80112002;
int n,m;
int dp[N],in[N],out[N];
vector<int> G[N];

int dfs(int cur){
	if(dp[cur]!=0)
		return dp[cur]%MOD;
	if(!in[cur])
		return dp[cur]=1;
	for(int i:G[cur])
		dp[cur]=(dp[cur]+dfs(i))%MOD;
	return dp[cur]%MOD;
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1,u,v;i<=m;i++){
		cin>>u>>v;
		G[v].push_back(u);
		in[v]++,out[u]++;
	}
	int ans=0;
	for(int i=1;i<=n;i++)
		if(!out[i])
			ans=(ans+dfs(i))%MOD;
	cout<<ans;
	return 0;
}

P6145

令 \(dp_i\) 表示第 \(i\) 次挤奶的最早时间。

答案:所有 \(dp_i\)。

初始:\(dp_i=s_i\)。

转移:\(dp_i=\max(dp_i,dp_{cur}+w)\)(注意是取 \(\max\),因为要保证所有的邻接点要求均满足,当然必须得满足挤奶时间最晚的那个了)。

all the good girls go to hell
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=1e5+5;
int n,m,c;
int dp[N];
bool vis[N];
struct Edge{
	int v,w;
};
vector<Edge> G[N];

int dfs(int cur){
	if(vis[cur])
		return dp[cur];
	vis[cur]=1;
	for(auto i:G[cur])
		dp[cur]=max(dp[cur],dfs(i.v)+i.w);
	return dp[cur];
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m>>c;
	for(int i=1;i<=n;i++)
		cin>>dp[i];
	for(int i=1,u,v,w;i<=c;i++){
		cin>>u>>v>>w;
		G[v].push_back({u,w});
	}
	for(int i=1;i<=n;i++)
		cout<<dfs(i)<<'\n';
	return 0;
}

P1775

典。略。

when the party's over
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=3e2+5;
int n,m,c;
int a[N],dp[N][N],s[N];
bool vis[N][N];
struct Edge{
	int v,w;
};
vector<Edge> G[N];

int dfs(int l,int r){
	if(vis[l][r])
		return dp[l][r];
	vis[l][r]=1;
	for(int i=l;i<r;i++)
		dp[l][r]=min(dp[l][r],dfs(l,i)+dfs(i+1,r)+s[r]-s[l-1]);
	return dp[l][r];
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n;
	memset(dp,0x3f,sizeof dp);
	for(int i=1;i<=n;i++)
		cin>>a[i],s[i]=s[i-1]+a[i],dp[i][i]=0;
	cout<<dfs(1,n);
	return 0;
}

P2217

挺有意思一题。

发现我们关心的东西:当前矩阵是啥,以及分割成了几个矩阵。

当前矩阵需要使用四个坐标描述,因此我们有状态:

令 \(dp_{x,y,xx,yy,k}\) 表示当前矩阵对角顶点为 \((x,y),(xx,yy)\),且已分割了 \(k\) 个矩阵的平方和(\(\sum^n_{i=1} (a_i-avg)^2\))最小值。

值得一提的是,序列 \(a\) 的均方差为:

\[\sqrt{\frac{\sum^n_{i=1} (a_i-avg)^2}{n}}\\ \]

其中:

\[avg=\frac{\sum^n_{i=1} a_i}{n} \]

然后记忆化搜索即可,转移自己画一下图就能推出来了,注意两部分拼起来的时候不要把平方和再加一遍。

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

const int N=11;
int a,b,n;
double avg;
int scr[N][N];
double dp[N][N][N][N][N];

double get(int x,int y,int xx,int yy){
   int res=0;
   for(int i=x;i<=xx;i++)
       for(int j=y;j<=yy;j++)
           res+=scr[i][j];
   return (res-avg)*(res-avg);
}
double dfs(int x,int y,int xx,int yy,int k){
   if(k==1)
       return dp[x][y][xx][yy][k]=get(x,y,xx,yy);
   if(dp[x][y][xx][yy][k])
       return dp[x][y][xx][yy][k];
   dp[x][y][xx][yy][k]=1e9;
   for(int i=x;i<xx;i++)
       for(int j=1;j<k;j++)
           dp[x][y][xx][yy][k]=min(dp[x][y][xx][yy][k],dfs(x,y,i,yy,j)+dfs(i+1,y,xx,yy,k-j));
   for(int i=y;i<yy;i++)
       for(int j=1;j<k;j++)
           dp[x][y][xx][yy][k]=min(dp[x][y][xx][yy][k],dfs(x,y,xx,i,j)+dfs(x,i+1,xx,yy,k-j));
   return dp[x][y][xx][yy][k];
}

int main(){
   ios::sync_with_stdio(0);
   cin.tie(0);
   cin>>a>>b>>n;
   for(int i=1;i<=a;i++)
       for(int j=1;j<=b;j++)
           cin>>scr[i][j];
   for(int i=1;i<=a;i++)
        for(int j=1;j<=b;j++)
        avg+=scr[i][j];
    avg/=n;
   cout<<setprecision(2)<<fixed<<sqrt(dfs(1,1,a,b,n)/(double)n);
   return 0;
}

发现彩蛋了吗(

标签:Living,const,cur,int,long,vis,81,Dream,dp
From: https://www.cnblogs.com/XOF-0-0/p/18455057

相关文章

  • (2024最新毕设合集)基于SpringBoot的乡村书屋小程序-31881|可做计算机毕业设计JAVA、PHP
    摘要随着信息技术的快速发展和互联网的广泛普及,数字化服务的需求不断增长,乡村书屋作为传统的文化服务机构也需要适应这一变革。本研究将使用Java开发技术,通过springboot作为框架,结合微信小程序,和MySQL作为数据存储的技术,开发一套功能齐备可移动的乡村书屋小程序,旨在提升乡......
  • FL Studio 24.1.2.4381中文版免费下载及FL Studio 24最新使用学习教程
    家好呀,作为一个资深的音乐爱好者和制作人,今天我要安利一个我最近超级痴迷的数字音频工作站软件——FLStudio24.1.2.4381中文版。这款产品可是让我的音乐创作之路如虎添翼,快来跟我一起看看它的炫酷功能吧!最近接到很多小伙伴的私信,都在问我平时会使用哪些音乐软件,能不能给一......
  • Living-Dream 系列笔记 第80期(国庆集训合集)
    IDDFS使用场景:搜索树非常大而答案的深度较浅,一般在\(20\)以内,且dfs会TLE,bfs会MLE。算法原理:以dfs的形式搜索;设定搜索的深度限制\(dep\);dfs深度不能超过\(dep\),且要恰好遍历所有\(dep\)的状态;若在\(dep\)层没有找到答案,\(dep+1\todep\),重新DFS......
  • P9752 [CSP-S 2023] 密码锁&&P8814 [CSP-J 2022] 解密
    GutenTag!Schön,dichzusehen!今天也是很懒惰的一天呢!所以今天三合一!题目:[CSP-S2023]密码锁题目描述小Y有一把五个拨圈的密码锁。如图所示,每个拨圈上是从$0$到$9$的数字。每个拨圈都是从$0$到$9$的循环,即$9$拨动一个位置后可以变成$0$或$8$,因为校园里......
  • PbootCMS附件上传失败报错UNKNOW: Code: 8192; Desc: stripos(): Non-string needles
    当遇到PBootCMS附件上传失败,并报错 UNKNOW:Code:8192;Desc:stripos():Non-stringneedleswillbeinterpretedasstringsinthefuture. 时,这通常是因为PHP的版本更新导致某些函数的行为有所改变。在这个情况下,stripos() 函数在处理非字符串参数时会发出警告,因为它......
  • SSM电影院订票系统k6l81 在线充值订座
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,电影信息,电影类型,电影资讯开题报告内容一、研究背景与意义随着人们生活水平的提高,电影已成为日常娱乐生活中不可或缺的一部分。然而,传统电影院......
  • [数据集][目标检测]车辆类型检测数据集VOC+YOLO格式8144张196类别
    数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):8144标注数量(xml文件个数):8144标注数量(txt文件个数):8144标注类别数:196标注类别名称:[“AMGeneralHummerSUV2000”,“Acura......
  • Leetcode 981. 基于时间的键值存储
    1.题目基本信息1.1.题目描述设计一个基于时间的键值数据结构,该结构可以在不同时间戳存储对应同一个键的多个值,并针对特定时间戳检索键对应的值。实现TimeMap类:TimeMap()初始化数据结构对象voidset(Stringkey,Stringvalue,inttimestamp)存储给定时间戳timestamp......
  • 洛谷每日一题(P1481 魔族密码)字典树解法
    原题目链接:P1481魔族密码-洛谷|计算机科学教育新生态(luogu.com.cn)原题目截图:思路分析:这道题的话其实有很多种方法,可以用动态规划做,不过我一看到这道题,脑子里不禁蹦出一个数据结构:“字典树”!字典树+深度优先搜索。那么在这之前,我们先来了解一下什么是字典树吧!什......
  • Orange Pi + SPI点亮 ws2812
    开发板型号:OrangePiOne系统版本:Ubuntu20.04focalDesktop接口:SPI1.连线TB上买的ws2812大概长这样:细节标在图上了。带插头的一端连上即可。其带针脚一端是多组灯带串联时候用。DI接SPI的MOSI。参考博客[1]2.启用硬件SPI在设置里有一个orangepi-config的执行程序,可......