10559 - Blocks(方块消除|DP)

该题乍一看和矩阵链乘很相似,可是有一个不同之处就是该题可以拼接 。   为了达到这个目的,我们不得不拓展维度d[i][j][k],用一个k表示最右边拼接了k个和a[j]相同颜色的方块。

问题的关键在于拼接,当右边存在一个q < p 且 a[q] == q[j] && a[q] != a[q+1] 时,可以拼接,要注意,所有满足这个条件的q都应该递归求解,因为哪一部分拼接起来更好,是不一定的 。

细节见代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 205;
int t,n,d[maxn][maxn][maxn],a[maxn],Case = 0;
int dp(int i,int j,int k) {
    int& ans = d[i][j][k];
    if(ans >= 0) return ans;
    ans = 0;
    int q = j+1,p = j,u;
    for(u=j;u>=i;u--) {  //求解p
        if(a[u]!=a[j]) break;
        else p = u;
    }
    if(p == i) return ans = ((j-p+1+k)*(j-p+1+k));//递归边界
    for(q=i;q<p;q++) { //求解q
        if(a[q] == a[j] && a[q+1] != a[j])
            ans = max(ans,dp(q+1,p-1,0) + dp(i,q,j-p+1+k) );//决策2
    }
    ans = max(ans,dp(i,p-1,0) + (j-p+1+k)*(j-p+1+k));//决策1
    return ans;
}

int main() {
    scanf("%d",&t);
    while(t--) {
        scanf("%d",&n);
        memset(d,-1,sizeof(d));
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        printf("Case %d: %d\n",++Case,dp(1,n,0));
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-17 16:34:48

10559 - Blocks(方块消除|DP)的相关文章

UVA - 10559 Blocks 和 Vasya and Binary String CodeForces - 1107E (dp OR 记忆化搜索)

UVA - 10559 Blocks 题意:消消乐,每次连续相同的可以消除,分数加上长度的平方,问最多可以获得几分全部消完 题解: 区间dp + 记忆化搜索 dp[i][j][k] : (区间 [i,  j] 后面带上一段和 j 颜色相同的且长度为 k )的消消乐最大积分 1.消最后一段颜色和 j 颜色相同的 dp[i][j][k] <-- dp[i][j-1][0] + (k+1)^2 2.对于i <= l < j, 如果 l 和 j 的颜色相同, 那么可以把 [l+1, j-1]消掉

P2135 方块消除

题目描述 Jimmy最近迷上了一款叫做方块消除的游戏.游戏规则如下:n个带颜色方格排成一列,相同颜色的方块连成一个区域(如果两个相邻方块颜色相同,则这两个方块属于同一区域).为简化题目,将连起来的同一颜色方块的数目用一个数表示. 例如,9 122233331表示为 4 1 2 3 1 1 3 4 1 游戏时,你可以任选一个区域消去.设这个区域包含的方块数为x,则将得到x^2个分值.方块消去之后,其余的方块就会竖直落到底部或其他方块上.而且当有一列方块被完全消去时,其右边的所有方块就会向左移一格.

Blocks题解(区间dp)

Blocks题解 区间dp 阅读体验...https://zybuluo.com/Junlier/note/1289712 很好的一道区间dp的题目(别问我怎么想到的) dp状态 其实这个题最难的地方是这道题目的状态怎么设 首先既然是区间dp,那肯定最先想到的状态是 $dp[i][j]$表示消掉区间$[i,j]$上所有的块的最大分数 突然发现这个状态会受区间外和$i$或$j$颜色相同的块的影响 并且转移也并不好转移=_= 所以我们考虑换一种状态... 既然说会受到外面的块的影响?那考虑一种方法来

[BNUZOJ1261][ACM][2016北理校赛]方块消除(栈,字符串)

玩过方块消除游戏吗?现在规定当有两个或两个以上相邻且颜色相同的方块在一起的时候,它们就会产生消除反应.当存在多个消除反应同时产生时,最下的反应先执行.现在只给你其中一列,求最后剩下的方块结果. 输入要求 第一行是一个整数T(T<=100),表示有T组测试数据.每组测试数据一行.每行有一串数字(数字长度<=1,000,000),按从下往上给出一列方块的颜色(颜色用0-9表示,每个数字代表一种颜色).(数字长度大于100,000的不超过5组) 输出要求 输出消除后的结果. 测试数据示例 输入 21

poj 1390 Blocks (经典区间dp 方块消除)

Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4250   Accepted: 1704 Description Some of you may have played a game called 'Blocks'. There are n blocks in a row, each box has a color. Here is an example: Gold, Silver, Silver, Sil

UVa 10559 Blocks - 动态规划

题目传送门 传送门 题目大意 有$n$个方块排成一排,每次可以选择一段连续相同的颜色的方块消去并将两端拼接起来,设消去的长度为$x$,那么可以得到$x^2$的分数.问消去所有方块后的最高得分. 标算的状态设计感觉比较神仙. 设$f_{l, r, k}$表示考虑到第$l$个方块到第$r$个方块,在第$r$个方块后面有$k$个和第$r$个方块的颜色一样的方块,将这些方块都消去能够得到的最大的分数. 首先不难发现每次消除一定消除的是当前一个极大颜色相同的连续段. 转移的时候考虑$r$所在原序列的一个极

UVA - 10559 Blocks

题文:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1500(或者见紫书) 题解: 因为这个题目我们用区间的dp常见套路设dp[i][j]表示处理到i~j的最大贡献不能靠枚举断点进行转移,所以我们要更细致的描述这个状态.设dp[i][j][k],表示把第i个区间和第j个区间合并,并且由于前面的消除有k个与区间j的颜色相同的方块接着j后面的

【Uva10559】Blocks(区间DP)

Description 题意:有一排数量为N的方块,每次可以把连续的相同颜色的区间消除,得到分数为区间长度的平方,然后左右两边连在一起,问最大分数为多少. \(1\leq N\leq200\) Solution 区间DP,对于一个连续的同色区间,可以直接消掉,或者从左边或者右边搞到和它同色的区间和在一起再一起消掉. 读入序列时预处理一下,将各个连续同色区间处理为一个点,记录它的颜色和长度,便于处理 然后就是区间DP啦,虽然要表示左边和右边,但是左边状态也可以表示为左边序列的右边,就只要开3维就行

poj3734 Blocks[矩阵优化dp or 组合数学]

Blocks Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6578   Accepted: 3171 Description Panda has received an assignment of painting a line of blocks. Since Panda is such an intelligent boy, he starts to think of a math problem of paint