您的位置:首页 > 其它

【2015福州夏令营】三重镇

2015-11-03 11:00 295 查看
【2015福州夏令营】三重镇
Time Limit:10000MS  Memory Limit:65536K
Description

小西同学最近喜欢上了iOS 游戏《三重镇Triple Town》。游戏之余,小西也在思考如何才能在这个游戏中获得更高的分数。

游戏在一个1 * 3的地图中进行。初始的时候,所有的格子都是空白位置。游戏给定一个建造序列,玩家按照此建造序列依次选择空白位置建造相应的建筑单位。建筑有九个不同的等级,标注为L1,L2….,L9。

当玩家在一个空白位置建造单位之后,有可能引起反应。反应的构成条件是:当前的三个格子中的建筑物都是同一等级的,则这三个建筑将合并为一个下一等级的建筑,此建筑的位置为最后建造的建筑单位位置,其他位置将变回空格。另外需要注意的是,L9 为建筑的最高等级,所以三个L9并不会合并。

游戏中还设有两种道具,分别为“星星”和“炸弹”。

在游戏开始时,玩家被给定p个星星道具和q个炸弹道具,玩家可以在任意时刻使用。两者功能如下:

“星星”道具:可以放置在一个空格位置。当星星被放置时,星星会自动变为能引起反应的最高等级建筑。当在该位置不能引起任何反应时,星星变为L1。

例如,当前有两个位置上是L5,此时放置星星,则会变为L5,同时导致一次反应,最后放置星星的位置上出现了一个L6,其他位置都是空白。

“炸弹”道具:炸弹道具可以放在一个有建筑的位置上,作用为炸掉这个建筑并将该位置恢复为空格。当使用炸弹时,得分将扣除被炸掉的建筑的一半分数(即得分为负数)。

在游戏的进行过程中,玩家必须按照给定的顺序进行建造,而且不能跳过任何一个给定的建筑,但可以随时穿插使用两种道具,也可以随时结束游戏。游戏的目标是,通过合理的操作,取得最高的分数。

Input

第一行两个整数p, q。

第二行一个整数n。

第三行n个整数,表示所有给定的建筑的等级。保证输入的数一定在[1..9]内

Output

一个整数表示答案。

Sample Input


1 1
5
4 5 5 5 6


Sample Output


39750


Hint

【数据范围】

对于20%的数据:0 <= n, p, q <= 5

对于另外20%的数据:p = q = 0

对于100%的数据:n <= 50, p,q <= 30

 

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int value[10] = {0, 4, 20, 100, 500, 1500, 5000, 20000, 100000, 500000};
int f[2][10][10][10][51][51];
int p, q, n, a[101], ans;
int use;
void renew(int a, int b, int c, int d, int e, int f, int val)
{
if (::f[a][b][c][d][e][f]<val)::f[a][b][c][d][e][f] = val;
}
int main()
{
scanf("%d%d%d", &p, &q, &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
memset(f, 0xe0, sizeof(f));
int F = 1;
f[0][0][0][0][0][0] = 0;
for (int i = 0; i <= n; i++){
F = !F; memset(f[!F], 0xe0, sizeof(f[!F]));
for (int r = 0; r <= p; r++)
for (int s = 0; s <= q; s++)
for (int j = 0; j < 10; j++)
for (int k = 0; k < 10; k++)
for (int l = 0; l < 10; l++)
if (f[F][j][k][l][r][s] >= 0){
use = max(use, i);
ans = max(ans, f[F][j][k][l][r][s]);
int now = a[i + 1], val = f[F][j][k][l][r][s];
//use star
if (r != p){
if (j == 0){
if (k == l && k != 9)
renew(F, k + 1, 0, 0, r + 1, s, val + value[k] + value[k + 1]);
else renew(F, 1, k, l, r + 1, s, val + value[1]);
}
if (k == 0){
if (j == l && j != 9)
renew(F, 0, j + 1, 0, r + 1, s, val + value[j + 1] + value[j]);
else renew(F, j, 1, l, r + 1, s, val + value[1]);
}
if (l == 0){
if (k == j && j != 9)
renew(F, 0, 0, j + 1, r + 1, s, val + value[j + 1] + value[j]);
else renew(F, j, k, 1, r + 1, s, val + value[1]);
}
}
//use bomb
if (s != q){
if (j != 0) renew(F, 0, k, l, r, s + 1, val - value[j] / 2);
if (k != 0) renew(F, j, 0, l, r, s + 1, val - value[k] / 2);
if (l != 0) renew(F, j, k, 0, r, s + 1, val - value[l] / 2);
}
//put
if (i < n){
if (j == 0){
if (k == l && k != 9 && now == k)
renew(!F, k + 1, 0, 0, r, s, val + value[k] + value[k + 1]);
else renew(!F, now, k, l, r, s, val + value[now]);
}
if (k == 0){
if (j == l && j != 9 && now == j)
renew(!F, 0, j + 1, 0, r, s, val + value[j + 1] + value[j]);
else renew(!F, j, now, l, r, s, val + value[now]);
}
if (l == 0){
if (k == j && j != 9 && now == j)
renew(!F, 0, 0, j + 1, r, s, val + value[j + 1] + value[j]);
else renew(!F, j, k, now, r, s, val + value[now]);
}
}
}
}
printf("%d\n", ans);
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: