ural False Mirrors (状态压缩+记忆化搜索)

2024-08-28 10:18

本文主要是介绍ural False Mirrors (状态压缩+记忆化搜索),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://acm.timus.ru/problem.aspx?space=1&num=1152


有n个阳台围城一圈,每个阳台都有若干个怪兽,一次可以打三个相邻的阳台上的怪兽,它们就会全部死去,但攻击者会受到没有死去怪兽的攻击,每个怪兽的攻击是1unit,问最后攻击者受到的最小伤害。


n <= 20,可以直接dfs过去。

1次WA,1次TLE。

WA是没看透题意,我判断的递归终止的条件是怪兽数目小于等于3,这是不对的,就算怪兽数目小于等于3,也不一定能一次打完,因为它只能打连续的怪兽,若两个怪兽之间的距离大于等于2,那么还需要一次才能打完。

TLE因为没加剪枝,dfs的过程中一旦发现已受攻击值大于最优值,就返回。


#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL __int64
#define eps 1e-12
#define PI acos(-1.0)
#define PP pair<LL,LL>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1000;
const int mod = 1000000009;int a[22],vis[22];
int Min;
int n;
void dfs(int num,int sum,int att)
{if(att >= Min) //TLE的关键!return;if(num == 1){Min = min(Min,att);return;}//判断没死的怪兽的位置是否相邻,只有相邻递归才结束else if(num == 2){int p[3],cnt=0;for(int i = 1; i <= n; i++)if(!vis[i])p[++cnt] = i;if(p[2] - p[1] <= 1 || p[2]-p[1] == n-1){Min = min(Min,att);return;}}else if(num == 3){int p[3],cnt = 0;for(int i = 1; i <= n; i++){if(!vis[i]){if(i <= n-2 && !vis[i+1] && !vis[i+2]){Min = min(Min,att);return;}else if(!vis[n-1] && !vis[n] && !vis[1]){Min = min(Min,att);return;}}}}for(int i = 1; i <= n; i++){if(!vis[i]){int tmp = 0,f1 = 0,f2 = 0,t;vis[i] = 1;tmp += a[i];if(i > 1 && !vis[i-1]){vis[i-1] = 1;tmp += a[i-1];f1 = 1;}else if(i == 1 && !vis[n]){vis[n] = 1;tmp += a[n];f1 = 1;}if(i < n && !vis[i+1]){vis[i+1] = 1;tmp += a[i+1];f2 = 1;}else if(i == n && !vis[1]){vis[1] = 1;tmp += a[1];f2 = 1;}t = sum - tmp;dfs(num-1-f1-f2,t,att+t);vis[i] = 0;if(i > 1 && f1 == 1)vis[i-1] = 0;else if(i == 1 && f1 == 1)vis[n] = 0;if(i < n && f2 == 1)vis[i+1] = 0;else if(i == n && f2 == 1)vis[1] = 0;}}
}int main()
{int sum;while(~scanf("%d",&n)){sum = 0;for(int i = 1; i <= n; i++){scanf("%d",&a[i]);sum += a[i];}Min = INF;memset(vis,0,sizeof(vis));dfs(n,sum,0);printf("%d\n",Min);}return 0;
}


又换了一种新姿势,因为n<=20,且每个怪物在一种状态下只有0和1两个选择,所以共有(1<<n)-1种状态,然后记忆化搜索。


#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL __int64
#define eps 1e-12
#define PI acos(-1.0)
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 50010;int n,num[22];
int dp[(1<<20)+10];int dfs(int sta)
{if(dp[sta] != INF)return dp[sta];int ss,a,b;for(int i = 1; i <= n; i++){if(sta&(1<<(i-1))){ss = sta;a = (i == 1?n:i-1);b = (i == n?1:i+1);ss -= (1<<(i-1));if(ss&(1<<(a-1)))ss -= (1<<(a-1));if(ss&(1<<(b-1)))ss -= (1<<(b-1));int tmp = 0;for(int j = 1; j <= n; j++)if(ss & (1<<(j-1)) )tmp += num[j];dp[sta] = min(dp[sta],dfs(ss)+tmp);}}return dp[sta];
}int main()
{while(~scanf("%d",&n)){for(int i = 1; i <= n; i++)scanf("%d",&num[i]);memset(dp,INF,sizeof(dp));dp[0] = 0;printf("%d\n",dfs((1<<n)-1));}return 0;
}


这篇关于ural False Mirrors (状态压缩+记忆化搜索)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114480

相关文章

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn