首页 > 其他分享 >[262144 P]

[262144 P]

时间:2024-03-14 12:14:43浏览次数:26  
标签:int 合成 262144 端点 区间 include

262144 P

题目描述

游戏一开始有\(n\)个正整数,\((2<=n<=262144)\),范围在\(1-40\)。在一步中,贝西可以选相邻的两个相同的数,然后合并成一个比原来的大一的数(例如两个7合并成一个8),目标是使得最大的数最大,请帮助Bessie来求最大值

思路

我们假设所有的数全是\(40\)那么最大可以合成出来的数是\(58\),可作为数组的一维

定义\(f[i][j]\)为能合成出来\(i\),且左端点为\(j\)的情况下的区间长度/右端点,右端点比区间长度稍简单一点,这里采用右端点的情况

状态转移方程:\(f[i][j] = f[i-1][f[i-1][j]]\)

这里有类似倍增的意思,\(f[i-1][j]\)是以\(j\)为左端点,能合成出\(i-1\)的右端点,那\(f[i-1][f[i-1][j]]\)就是以上一个右端点作为下一次左端点再往后找,那么就是两个\(i-1\)合成了\(i\)

初始化/区间开闭问题

\(f[a[i]][i]] = i + 1\),这里要定义为左闭右开的区间

举个例子如果是两个\(1\)要合成\(2\),那么\(f[2][1] = f[1][f[1][1]]\)如果不加1的话,它更新完就还是1没法扩展过去,更离谱的是:如果不加1,且一共只有一个数的情况下,它甚至可以自己左脚踩右脚一直往上增,所有的\(f[n][1]\)都会被更新,考虑完上面的情况就可以直接给出代码

洛谷P3147

#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 262145;
int ans,n,f[60][maxn];//f(i,j)表示能合成i,左端点为j情况下的右端点(左闭右开区间) 
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		f[x][i] = i + 1;
	}
	for(int i=1;i<=58;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(!f[i][j])
				f[i][j] = f[i-1][f[i-1][j]];
			if(f[i][j]) ans = i;
		}
	}
	printf("%d",ans);
	return 0;
}

标签:int,合成,262144,端点,区间,include
From: https://www.cnblogs.com/-Wind-/p/18072494

相关文章

  • P3147 [USACO16OPEN] 262144 P
    Link这个题有一个很特殊的点,就是最大值不会超过28,可以想一下最多可以合并多少次。那么常规的区间dp是不能使用的,就要采用特殊的形式,因为很难的确定应该怎么转移,那么就换一种思路,转移的对象变成另外一个端点。\(dp_{i,j}\)表示\(i\)在左边,达到\(j\)的话的右端点位置\(dp_{i,j......
  • P3147 [USACO16OPEN]262144 P
    第十题P3147[USACO16OPEN]262144P题目分析此题为区间\(DP\),却与一般的\(DP\)题不同。能够看出是两个相邻区间合并,但是却不知道具体是哪两个区间。因此,我们需要......
  • shenyu2.5.0解决Exceeded limit on max bytes to buffer:262144
    一、环境shenyu:2.5.0proxy:divide二、异常描述普通请求没有问题,但当json超过1M时会报错org.apache.shenyu.web.handler.GlobalErrorHandler-handleerror:[26ba5fb1-2]......
  • 解决报错max virtual memory areas vm.max_map_count [65530] is too low, increase t
    https://blog.csdn.net/weixin_39643007/article/details/1084351391.搭建ES集群启动之后报如下的错误:   2.从报错信息vm.max_map_count看出内存太小了所以需......
  • luogu P8275 [USACO22OPEN] 262144 Revisited P
    题面传送门这里有个sb写这道题写了一下午。首先来考虑一段子段上的答案,显然答案有一个区间,设最大值为\(E\),则最小值一定在\([E,E+\logn]\)之间。我们考虑按照最大值分......