【阶段1】【动态规划DP】POJ 1390 Blocks or 消木块

【题意】
你们中的一些人可能玩过一个叫做消木块的游戏。
n个木块排成一列,每个木块都有一个颜色。
例如下图中木块的颜色分别为:金,银,银,银,银,铜,铜,铜,金。



每次,你都可以点击一个木块,这样被点击的木块以及和它相邻并且同色的木块就会消除。
如果一次性消除了k个木块,那么就会得到k*k分。
例如下图所示,点击银色木块,四个木块被消去,得到16分。

给定你一个游戏初始状态,请你求出最高得分是多少。

【阶段1】【动态规划DP】POJ 1390 Blocks or 消木块_第1张图片
【输入格式】
第一行包含整数t,表示共有t组测试数据。
每组数据第一行包含整数n,表示共有n个木块。
第二行包含n个整数,表示n个木块的颜色。
代表木块颜色的整数范围是1~n。


【输出格式】
每组数据输出一个结果,每个结果占一行。
输出格式为“Case x: y”,其中x为数据组别编号,从1开始,y为结果。


【数据范围】
1≤t≤100
1≤n≤200


【输入样例】
2
9
1 2 2 2 2 3 3 3 1
1
1


【输出样例】
Case 1: 29
Case 2: 1

心路历程

step1:

  • 理所当然地想到用区间动态规划,f[x][y]定义为区间x~y的最大得分
  • 想法大概就是:每个区间的得分方法有两种
  • 第一种:劈成两半,也就是:f[x][y]=max(f[x][y],f[x][k]+f[k+1][y]);
  • 第二种:若两端木块相同,可以先将中间的消掉,使两端合并ÿ

你可能感兴趣的:(阶段1,动态规划)