ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

UVA10559&P2135 方块消除 题解

2021-06-16 19:33:38  阅读:195  来源: 互联网

标签:分数 组合 color 题解 P2135 消掉 UVA10559 消除


消除方块 传送门
看了看题解区好像没有这样的解法?
这是一种比较懒癌的解法。(也比较详细

首先来说说看状态, \(f_{i,j,k}\)表示\([i, j]\)范围消除完之后,剩余k个颜色为\(color_{i}\)的最大分数
比如\(f_{i,j,0}\)表示把\([i, j]\)完全消除(啥都不剩)的最大分数

那么问题来了我们为什么要怎么设呢?
想想看对于每一个块我们只有两种操作,
一种单独消掉
一种是和其他块组合起来消掉:比如12221, 我们可以把222消掉,然后让11组合起来
对,也就是说,当我们要把两个块组合起来时, 一定要把他们之间的所有块先消除, 例如把i, k组合起来,要先把\([i+1, k-1]\)这个区间消除掉, 得到分数是\(f_{l+1, k-1, 0}\)
当我们计算\(f_{i, j, k}\)时, 假设i是新放进去的块([i+1, j]已经计算好了)
直接消掉i显然为\(1+f_{i+1, j, 0}\), 进一步考虑组合
我们枚举\([i+1, j]中每一个为color_{i}的块k\)
我们考虑在\([k, j]\)中选择若干个块与i合并 分数为\(f_{k,j,x}\)(剩余x个用来合并) \([i+1, k-1]\)直接消掉\(f_{i+1, k-1, 0}\)
枚举这个x,ok
(这个地方需要仔细思考)

复杂度\(O(n^4)\)

实在不行看看代码

	for(int i=1; i<=n; i++){
		f[i][i][1] = 0;//直接把这个块保留,不需要消除,所以分数为0 
		f[i][i][0] = 1;//直接消除这一个块, 分数1 
	}
	for(int j=2; j<=n; j++){
		for(int i=1; i+j-1<=n; i++){
			int l=i, r=i+j-1;
			f[l][r][0] = f[l+1][r][0] + 1;//直接消除i 
			f[l][r][1] = f[l+1][r][0];//直接保留i 

			for(int st=l+1; st<=r; st++){
				if(color[st] != color[l]) continue;//枚举上面的“x” 
				for(int k=1; k<n; k++){//注意边界 
					f[l][r][k+1] = max(f[l][r][k+1], f[l+1][st-1][0] + f[st][r][k]);
					//从st-r中取k个与i合并, 一共k+1个 
					f[l][r][0] = max(f[l][r][0], f[l][r][k+1] + (k+1)*(k+1));
					//考虑把k+1个直接消除, 更新最大分数 
				} 
			}
		}
	}

标签:分数,组合,color,题解,P2135,消掉,UVA10559,消除
来源: https://www.cnblogs.com/ltdjcoder/p/14890738.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有