luogu UVA10559 ybtoj 区间DP课堂过关 例题3消除木块 & 方块消除 Blocks
Posted SSL_ZZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu UVA10559 ybtoj 区间DP课堂过关 例题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的主要内容,如果未能解决你的问题,请参考以下文章