Uva 10559 消除方块

题意:

每次可以选择一个区间(连续相同的序列)消除,得分为 len*len;问最大得分。

分析:

很容易想到是区间DP,但是不像普通的区间DP一样切割方式~~~

如果定义 d[ i ][ j ] 区间,那么在里面切割,将有两个部分,而且中间的要连续相等,连续相等的区间可能还要枚举,加上 判断连续相等,可能会时间超,而且不是就算枚举了,剩下的还要合并,确实麻烦。

一种新的区间DP状态定义: d[i][j][k] 区间 i ~ j 后面继续加 k 个字符(与 j 相同)的最优解。

那么答案是: d[1][n][0];

状态转移:首先一种情况是 d[i][j-1][0] + (k+1)^2;

然后是切割方式:如何切割呢?

如果: i 和 r 颜色相同,这里就有可能产生一种切割方式,首先是中间部分 d[i+1][r-1][0] ,然后是合并部分,d[l][i][k+1];

新思维,巧妙解决合并的问题~~~

#include <bits/stdc++.h>

using namespace std;

const int maxn = 205;
int n,v[maxn];
int d[maxn][maxn][maxn];

int dp(int l,int r,int k) {
    if(l>r) return 0;
    int& ans = d[l][r][k];
    if(ans) return ans;

    ans = dp(l,r-1,0) + (k+1)*(k+1);

    for(int i=r-1; i>=l; i--) {
        if(v[i]==v[r]) {
            ans = max(ans,dp(l,i,k+1)+dp(i+1,r-1,0));
        }
    }
    return ans;
}

int main()
{
    int t;
    scanf("%d",&t);

    for(int z = 1; z<=t; z++) {
        scanf("%d",&n);
        for(int i = 1; i <= n; i++) scanf("%d",&v[i]);
        memset(d,0,sizeof(d));

        printf("Case %d: %d\n",z,dp(1,n,0));

    }

    return 0;
}
时间: 2024-10-16 18:26:46

Uva 10559 消除方块的相关文章

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]消掉

html5消除方块游戏总结-对象

在短短2周内,做了2个项目,虽然时间很紧凑,很累,但我觉得这很充实,在每次的实战项目演练过程中都能发现许多平常不遇到的问题,也只有实际操作项目,才能让我所学知识活学活用,并且能够更快的适应实际工作中的项目. 这周做的是一个小游戏,一个小人物根据相同的颜色来消除方块的项目,虽然做游戏的时间很短暂,但我觉得我收获颇丰,不断的学习,让我觉得更踏实,虽然累,我也觉得很值得,这次项目主要让我们理解和使用面向对象编程这个概念. 对象是一个抽象的概念,是一种面对人的思维方式,人有特征,就如对象里的属性,而人有

uva 10559

记忆话搜索 DP 看了网上题解  状态方程真是巧妙 orz #include <cstdio> #include <cstdlib> #include <cmath> #include <set> #include <stack> #include <vector> #include <sstream> #include <cstring> #include <string> #include &l

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后面的

Html5消除方块游戏总结-其他

学习了最重要的-面向对象后,在这次游戏里,我还学习了其他重要的知识,以及对以前知识进行回顾和复习. 首先这次游戏大量运用了面向对象这个概念,我们把游戏的子弹.图形.玩家.背景都想像成一个对象角色,那么有对象就有他特有的属性. 这次的游戏制作是以个人为单位,每个人都坐一样的游戏,登陆页面采用了css和html5代码技术,并且在起背景图方面利用css3的动画效果做了一个不断滚动的动画效果,在第二个页面给玩家提供了选取道具的界面,这个界面也采用了css.html5技术,外加一个点击事件,利用对象原理,

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

方块十字消

方块十字消,一款非常有意思的十字消除方块小游戏,在经典十字消除玩法加入2016最新玩法,新颖而又不失经典.界面简约清新自然,玩法简单却又极富挑战,是少年儿童,女性朋友,休闲老人娱乐休闲,打发无聊时光必备神器.单机无需联网,再无流量困扰,等约会,乘地铁随时随地High起来! [游戏玩法]1.点击空格,只要是十字线能连接到的相同颜色的方块,就能被消除获得分数.2.系统会随机添加方块,添加方块后的格子不可以再点击消除.3.如果点击后没有被消除,则会缩短系统添加方块的时间,方格一旦被填满,则游戏结束.4

Qt-俄罗斯方块

声明: 仅个人小记 整个有效项目的文件已经上传csdn: http://download.csdn.net/detail/qq_25847123/9718822 目录: 1.前言 2.效果展示 3.主要代码 4.开发日志 5.小结 1.前言 整个程序的完成花了我不少时间, 有许多知识细节不够清楚,边学边做,断断续续完成的.之前有用C++直接做过一次俄罗斯方块,界面简陋,是在控制台运行的.这次用Qt实现,沿用了之前的总体思想,技术细节有所改动. 2.效果展示 刚开始: 开始游戏: 背景界面随着分数