题目大意:给你玩一个一维版的消灭星星,得分是当前消去的区间的长度的平方,求最大得分。

现在分析一下题目

因为得分是长度的平方,不能直接累加,所以在计算得分时需要考虑前一个状态所消去的长度,仅用dp[l][r]来表示区间最大得分是不足以用来转移的。

我们的解决方法是:增加一维预测未来可能会出现的情况,用dp[l][r][t]表示区间[l,r]之后附加t个与r同色的方块时所能得到的最大值。为了降低时间复杂度,我们可以在读入时处理一下,将一段长度为a、颜色为b的区间k表示成一个len[k]=a,col[k]=b的“点”。这样,当我们计算dp[l][r][0]时,首先尝试直接消除区间r,得到dp[l][r][0]=dp[l][r-1][0]+(len[r])^2,接着,将它之后所有可能的附加t个同色方块的情况都算出来:dp[l][r][t]=dp[l][r-1][0]+(len[r]+t)^2。之后,在[l,r-1]之间寻找可能与区间r同色的区间k,若col[r]==col[k],则尝试消除区间r与k之间的所有方块,让区间r与k并在一起计算分数并更新所有dp[l][r][t]的值:dp[l][r][t]=max(dp[l][r][t],dp[l][k][len[r]+t]+dp[k+1][r-1][0])。最后dp[1][n][0]即为答案。(n为一开始同色区间的数量)

代码:(140ms,用递推速度就是不一样,比记搜不知道高到哪里去了)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int col[],len[],dp[][][];
int sum[];
//by sclbgw7
inline int sq(int x)
{return x*x;} inline int maxn(int x,int y)
{return x>y?x:y;} int main()
{
int T,time;
scanf("%d",&T);
for(time=;time<=T;++time)
{
int n=,m,t1;//m为方块个数,n为区间个数
scanf("%d",&m);
for(int i=;i<=m;++i)
{
scanf("%d",&t1);
if(t1==col[n])
++len[n];
else
{
col[++n]=t1;
len[n]=;
}
}
for(int i=;i<=n;++i)
sum[i]=sum[i-]+len[i];//sum为前缀和,用于限定预测t的范围
memset(dp,,sizeof(dp));
for(int i=;i<n;++i)
for(int l=;l+i<=n;++l)
{
int r=l+i,re=sum[n]-sum[r];//re为当前t可能用到的最大值
for(int t=;t<=re;++t)
dp[l][r][t]=dp[l][r-][]+sq(t+len[r]);
for(int k=r-;k>=l;--k)
if(col[k]==col[r])
for(int t=;t<=re;++t)
dp[l][r][t]=maxn(dp[l][r][t],dp[l][k][len[r]+t]+dp[k+][r-][]);
}
printf("Case %d: %d\n",time,dp[][n][]);
//神坑!!!!!冒号之后要加一个空格!!!!!!!
}
return ;
}

UVA 10559 Blocks(区间DP&&递推)的更多相关文章

  1. UVA 10559 Blocks——区间dp

    题目:https://www.luogu.org/problemnew/show/UVA10559 应该想到区间dp.但怎么设计状态? 因为连续的东西有分值,所以应该记录一下连续的有多少个. 只要记录 ...

  2. UVA 10559 Blocks —— 区间DP

    题目:https://www.luogu.org/problemnew/show/UVA10559 区间DP,有点难想: 为了方便,先把原来就是连续一段相同颜色的点看做一个点,记一下长度: f[i][ ...

  3. 紫书 例题 9-9 UVa 10003 (区间dp+递推顺序)

    区间dp,可以以一个区间为状态,f[i][j]是第i个切点到第j个切点的木棍的最小费用 那么对于当前这一个区间,枚举切点k, 可以得出f[i][j] = min{dp(i, k) + dp(k, j) ...

  4. hdu2089(数位DP 递推形式)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. uva 10328 - Coin Toss 投硬币(dp递推,大数)

    题意:抛出n次硬币(有顺序),求至少k个以上的连续正面的情况的种数. 思路:转换成求抛n个硬币,至多k-1个连续的情况种数,用所有可能出现的情况种数减去至多k-1个的情况,就得到答案了.此题涉及大数加 ...

  6. UVA 10559 Blocks

    题目大意:有一串带颜色的方块,每次可以消掉颜色相同的一段,得到size^2的分数,问最多能得到多少分数.n≤200. 给这题状态跪下来. 显然的区间DP,但设f[i][j]是不够的. 考虑到之前做过的 ...

  7. UVA 11077 - Find the Permutations(递推)

    UVA 11077 - Find the Permutations option=com_onlinejudge&Itemid=8&page=show_problem&cate ...

  8. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  9. hdu 2604 Queuing(dp递推)

    昨晚搞的第二道矩阵快速幂,一开始我还想直接套个矩阵上去(原谅哥模板题做多了),后来看清楚题意后觉得有点像之前做的数位dp的水题,于是就用数位dp的方法去分析,推了好一会总算推出它的递推关系式了(还是菜 ...

随机推荐

  1. 针对《面试心得与总结—BAT、网易、蘑菇街》一文中出现的技术问题的收集与整理

    最近,我在ImportNew网站上,看到了这篇文章,觉得总结的非常好,就默默的收藏起来了,觉得日后一定要好好整理学习一下,昨天突然发现在脉脉的行业头条中,居然也推送了这篇文章,更加坚定了我整理的信心. ...

  2. python---图表的使用

    一:使用预览 二:插件使用来源 Highcharts(本次使用) ECharts 三:插件的使用 HighCharts的简单上手 (一)后台传递数据 getHchart方法获取用户数据(用户名,数据列 ...

  3. MESS-配置

    Author:KillerLegend From:http://www.cnblogs.com/killerlegend/p/3824989.html Date:2014.7.4 Part A 第一部 ...

  4. bzoj千题计划137:bzoj [CQOI2014]危桥

    http://www.lydsy.com/JudgeOnline/problem.php?id=3504 往返n遍,即单向2*n遍 危桥流量为2,普通桥流量为inf 原图跑一遍最大流 交换b1,b2再 ...

  5. 51 nod 1205 流水线调度

    51 nod 1205 流水线调度 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题   N个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工.每 ...

  6. python学习笔记2-文件操作

    一.文件操作 #文件操作一定要注意文件指针 f=open('','a+,encoding=utf-8) f.seek(0) #文件指针移到行首 f.tell()#查看文件指针的位置 f.read()# ...

  7. Scrapy可视化管理软件SpiderKeeper

    通常开发好的Scrapy爬虫部署到服务器上,要不使用nohup命令,要不使用scrapyd.如果使用nohup命令的话,爬虫挂掉了,你可能还不知道,你还得上服务器上查或者做额外的邮件通知操作.如果使用 ...

  8. 逆序对 inversion

      评测传送门 [问题描述] 有一个1 − n的排列,你会依次进行m次操作,第i次操作表示为(x i , y i ),交换以这两个 值为下标的元素,每次操作有一半的概率成功,你需要求出最后序列的逆序对 ...

  9. Ubuntu: HDF5报错: HDF5 header version与HDF5 library不匹配

    今天在执行一个用到hdf5的python脚本时,遇到如下错误 Warning! ***HDF5 library version mismatched error*** The HDF5 header ...

  10. 关于Unix/Linux的终端、伪终端、控制台和shell

    历史是什么:是过去传到将来的回声,是将来对过去的反映. ——雨果(法)<笑面人> 阅读本文大概需要花费你15分钟 文章导航: 计算机的发展 UNIX系统的诞生 UNIX系统的发展 终端与控 ...