首页 > 其他分享 >[lnsyoj2256]消除游戏

[lnsyoj2256]消除游戏

时间:2024-08-13 21:08:04浏览次数:14  
标签:lnsyoj2256 return 游戏 min int res dfs cost 消除

题意

给定序列 \(a\),每次可以选择其中长度 \(>m\) 且完全相同的一段并删除,并将序列的剩余部分拼合成一段;或在任意位置插入一个数。求最终将序列 \(a\) 清空的最小操作数

sol

很显然,本题的插入操作是为了能够使一段数能够凑够 \(m\) 个,因此我们可以只考虑删除操作,只在操作上下手脚即可。具体地,我们定义 \(cost_i\) 表示将长度为 \(i\) 的一段删除所需要的最小操作数,显然可得:

\[cost_i=\left\{\begin{matrix} 1(x\ge m) \\ m-x+1(x<m) \end{matrix}\right.\]

本题与[lnsyoj2239/luoguP5336/THUSC2016]成绩单较为相似,都为可以拼合的区间问题。设计 \(f_{l,r,k}\) 表示将区间 \([l,r]\) 清空,且 \(r\) 之后有 \(k\) 个元素与 \(a_r\) 相同的最小代价。 我们可以分为三种情况(实际上是两种,分为三种是为了减少细节处理)

  1. 将 \(r\) 与后面 \(k\) 个值一起删除;
  2. 将 \(r\) 与后面 \(k\) 个值放在一起(\(a_{r-1}=a_r\));
  3. 删除区间 \([x+1,r-1]\),将 \(x\) 与 \(r\) 及后面 \(k\) 个值放在一起(\(a_x=a_r,l\le x < r-1\))

综上可得转移方程:

\[f_{l,r,k}=\min\{f_{l,r-1,0} + cost_{k+1},f_{l,r-1,k+1}(a_{r-1}=a_r),\min_{x=l}^{r-2}\{f_{l,x,k+1} + f_{x+1,r-1,0}(a_x=a_r)\}\} \]

由于数据基本随机,因此实际的可用状态并不多,因此可以使用记忆化搜索。

这里有一个 trick,我们使 \(f_{l,r,m}\) 表示将区间 \([l,r]\) 清空,且 \(r\) 之后有 \(\ge k\) 个元素与 \(a_r\) 相同的最小代价,这是因为 \(k\) 这一维的主要目的是为了计算代价,且可以证明,每次将一段相同的区间全部拿完代价最小。这样,我们就将每次初始化所需的时空复杂度缩小到了 \(O(n^2m)\)。

代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 405;

int n, m;
int a[N];
int f[N][N][15];
int T;

int cost(int x){
    if (x >= m) return 1;
    else return m - x + 1;
}

int dfs(int l, int r, int k){
    if (k >= m) k = m;
    if (f[l][r][k]) return f[l][r][k];
    if (l == r) return cost(k + 1);
    int res = dfs(l, r - 1, 0) + cost(k + 1);
    if (a[r - 1] == a[r]) res = min(res, dfs(l, r - 1, k + 1));
    for (int i = l; i < r - 1; i ++ )
        if (a[i] == a[r]) res = min(res, dfs(l, i, k + 1) + dfs(i + 1, r - 1, 0));
    return f[l][r][k] = res;
}

int main(){
    scanf("%d", &T);
    for (int u = 1; u <= T; u ++ ) {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
        memset(f, 0, sizeof f);
        printf("%d\n", dfs(1, n, 0));
    }

    return 0;
}

标签:lnsyoj2256,return,游戏,min,int,res,dfs,cost,消除
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/lnsyoj2256

相关文章

  • D42 2-SAT+二进制枚举 P3825 [NOI2017] 游戏
    视频链接: P3825[NOI2017]游戏-洛谷|计算机科学教育新生态(luogu.com.cn)//2-SAT+二进制枚举O(2^8*(n+m))#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=100005;inthead[N],to[N<<1],ne[N<<1],idx;......
  • GameSalad-IOS-游戏开发学习手册-全-
    GameSaladIOS游戏开发学习手册(全)原文:LearnGameSaladforiOSGameDevelopmentforiPhone,iPad,andHTML5协议:CCBY-NC-SA4.0零、简介2007年,苹果推出了iPhone,彻底改变了我们的生活方式,但最重要的是iOS的诞生。今天,iOS被用于iPhone、iPad和iPodTouch。通过A......
  • 2D-游戏的物理引擎构建教程-全-
    2D游戏的物理引擎构建教程(全)原文:Buildinga2DGamePhysicsEngine协议:CCBY-NC-SA4.0一、2D游戏物理引擎开发简介电子补充材料本章的在线版本(doi:10.1007/978-1-4842-2583-7_1)包含补充材料,可供授权用户使用。物理引擎在许多类型的游戏中扮演着重要的角色。游戏对......
  • 代码随想录day28 || 122 买卖最佳时机2,55 跳跃游戏,45 跳跃游戏2,1005 k次取反最大数组
    122买卖股票最佳时机2funcmaxProfit(prices[]int)int{ //思路,因为支持同一天买入卖出,所以利润最大应该是所有正利润的加总结果 varsumint fori:=1;i<len(prices);i++{ ifprices[i]-prices[i-1]>0{ sum+=prices[i]-prices[i-1] } } returns......
  • 游戏安全入门-扫雷分析&远程线程注入
    前言无论学习什么,首先,我们应该有个目标,那么入门windows游戏安全,脑海中浮现出来的一个游戏--扫雷,一款家喻户晓的游戏,虽然已经被大家分析的不能再透了,但是我觉得自己去分析一下还是极好的,把它作为一个小目标再好不过了。我们编写一个妙妙小工具,工具要求实现以下功能:时间暂停、修......
  • 夏日狂欢,游戏新体验,植物大战僵尸杂交版 v2.3.5
    ......
  • 复苏的魔女遭遇VGCore.dll缺失危机:如何快速修复游戏启动难题?
    复苏的魔女遭遇VGCore.dll缺失危机时,确实会导致游戏无法正常启动。以下是一些快速修复此问题的步骤和建议:一、确认问题首先,确保错误信息确实是由于VGCore.dll文件缺失引起的。通常,游戏在尝试启动时会在屏幕上显示一条错误消息,明确指出缺少的DLL文件名。二、下载并替换缺失......
  • 简简单单,扫雷小游戏(极简版)
    目录前言一、扫雷要求二、准备工作1.建立文件2.游戏思路三、扫雷游戏代码步骤1:建立主函数步骤2:创建数组并初始化步骤3:打印数组步骤4:布置雷步骤5:排查雷步骤6:补全头文件四、完整代码 后言:前言用VS2022写的扫雷小游戏,超详细,一步一步帮你理透.一、......
  • 34.x86游戏实战-XXX过检测代码分析
    免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!本次游戏没法给内容参考于:微尘网络安全工具下载:链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3提取码:6tw3复制这段内容后打开百度网盘手机App,操作更方便哦上一个内容:33.x86游戏实战-喊话C......
  • 记一次TCP请求游戏服接口偶发超时问题处理:Linux内核网络参数调优
    记一次TCP请求游戏服接口偶发超时问题处理:Linux内核网络参数调优原创 国文 三七互娱技术团队  2024年07月08日18:00 广东 听全文01问题现象A云主机公网访问B云游戏服的一个接口出现偶发超时的问题。02问题原因经抓包定位到B云游戏服接口未响应请求报文导致,具体......