luogu UVA10559 ybtoj 区间DP课堂过关 例题3消除木块 & 方块消除 Blocks

Posted SSL_ZZL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu UVA10559 ybtoj 区间DP课堂过关 例题3消除木块 & 方块消除 Blocks相关的知识,希望对你有一定的参考价值。

【例题3】消除木块 & 方块消除 & Blocks


Link

【ybtoj】【区间DP课堂过关】【例题3】消除木块
【luogu】【UVA10559】 方块消除 Blocks
【UVA】【10559】Blocks
题面//因为不知道侵不侵权所以就是题面是私密的,有账号的直接看转送门就可了


题目大意

n n n个带有颜色的方块,没消除一段长度为 x x x的连续的相同颜色的方块可以得到 x 2 x^2 x2的分数,让你用一种最优的顺序消除所有方块使得得分最多。


解题思路

在洛谷解题报告中找了个讲得贼详细的才看懂的,不过那位巨爷的程序 (有点chou)


Code

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int oue = 300;
int T, n, head[oue], f[oue][oue][oue], a[oue], next[oue];

int dfs(int x, int y, int k) {
	if (x > y) return 0;
	if (f[x][y][k]) return f[x][y][k];
	f[x][y][k] = max(f[x][y][k], dfs(x, y - 1, 0) + (k + 1) * (k + 1));
	for(int m = next[y]; m >= x; m = next[m])
		f[x][y][k] = max(f[x][y][k], dfs(x, m, k + 1) + dfs(m + 1, y - 1, 0));
	return f[x][y][k];
}

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

以上是关于luogu UVA10559 ybtoj 区间DP课堂过关 例题3消除木块 & 方块消除 Blocks的主要内容,如果未能解决你的问题,请参考以下文章

Uva10559Blocks(区间DP)

uva10559区间dp升维

Uva 10559 消除方块

UVA10559 Blocks(区间dp)

UVA - 10559 Blocks

luogu P4170ybtoj 区间DP课堂过关 例题2木板涂色 & [CQOI2007]涂色