题目描述

赌城拉斯维加斯的米高梅大赌场最近推出了一种新式赌法。它的玩法是由庄家设局(所用赌具是一批五颜六色的筹码),赌徒只要交付一定数额的赌资即可入局。开赌前庄家将手中的筹码依次排开铺成一排构成一局,然后公布若干个筹码序列供赌徒选择,赌徒可以从庄家设的局中取走与公布序列相一致的筹码,然后庄家将余下的筹码拼接好,赌徒再继续取筹码,直到赌徒没有筹码可取为止,此时赌徒用他取得的筹码到总台换取相应面值的现金。例如:庄家设的局为rrrgggbbb,r,g,b为筹码的颜色,庄家公布给赌徒选择的筹码序列为rg和gb,则赌徒可以取走第3和第4个筹码rg,庄家将余下的筹码拼接后组成rrggbbb;赌徒继续取走第3和第4个筹码rg,庄家将余下的筹码拼接后组成rgbbb;赌徒还是取走第3和第4个筹码rg,此时剩下的筹码为bbb,赌局结束;如果赌徒第二和第三次不取rg,而改取gb的话,终局时剩下的筹码为rrb。类似地终局时剩下的筹码也可以是rrr或rbb。已知每种颜色筹码的面值,给定庄家设的局和公布给赌徒选择的筹码序列,编程计算赌徒的最大收益。

输入

第一行为一个正整数 K (1 ≤ K ≤26),表示筹码的颜色种类,一种颜色对应一个小写英文字母。
接下来的K行每行有一个小写英文字母和一个正整数,二者之间用空格隔开,表示该小写英文字母代表的一个筹码的面额。 
第K+2行为一个长度不超过150的由小写英文字母组成的字符串,表示庄家设的局。
第K+3行为一个正整数N (1 ≤ N ≤ 150),表示公布给赌徒选择的筹码序列总数。
接下来的N行每行一个由小写英文字母组成的字符串,表示一个筹码序列,所有N个字符串的长度总和不超过150。

输出

输出文件仅有一行包含一个整数表示赌徒在这一局中可能获得的最大收益。

样例输入

6
a 1
b 4
d 2
x 3
f 1
e 3
fxeeabadd
2
aba
ed

样例输出

16


题解

区间dp

bzoj2121 ,只不过给出的是字符串总长限制,因此设状态时需要将所有串压成一个串,中间用空字符隔开。转移时直接dp新串的位置。

权值只需要在统计答案时加上。

具体见代码吧。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 155
using namespace std;
int a[26] , ans[N] , pos[N];
char str[N] , w[N] , tmp[3];
bool f[N][N] , g[N][N][N << 1];
int main()
{
int t , n , m , x , len , l , r , i , j , sum = 0;
scanf("%d" , &t);
while(t -- ) scanf("%s%d" , tmp , &x) , a[tmp[0] - 'a'] = x;
scanf("%s%d" , str + 1 , &m) , n = strlen(str + 1);
for(i = 1 ; i <= n ; i ++ ) sum += a[str[i] - 'a'];
pos[0] = -1;
for(i = 1 ; i <= m ; i ++ )
scanf("%s" , w + pos[i - 1] + 2) , pos[i] = strlen(w + pos[i - 1] + 2) + pos[i - 1] + 1;
for(i = 1 ; i <= n ; i ++ )
{
f[i][i - 1] = 1;
for(j = 0 ; j < m ; j ++ ) g[i][i - 1][pos[j] + 1] = 1;
}
for(len = 1 ; len <= n ; len ++ )
{
for(l = 1 ; l <= n - len + 1 ; l ++ )
{
r = l + len - 1;
for(i = 0 ; i <= pos[m] ; i ++ )
{
if(str[r] == w[i]) g[l][r][i] |= g[l][r - 1][i - 1];
for(j = l ; j <= r ; j ++ ) g[l][r][i] |= g[l][j - 1][i] & f[j][r];
}
for(i = 1 ; i <= m ; i ++ ) f[l][r] |= g[l][r][pos[i]];
}
}
for(i = 1 ; i <= n ; i ++ )
{
ans[i] = ans[i - 1] + a[str[i] - 'a'];
for(j = 1 ; j <= i ; j ++ )
if(f[j][i])
ans[i] = min(ans[i] , ans[j - 1]);
}
printf("%d\n" , sum - ans[n]);
return 0;
}

【bzoj5147】casino 区间dp的更多相关文章

  1. 【BZOJ-4380】Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

  2. 【POJ-1390】Blocks 区间DP

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

  3. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  4. BZOJ1055: [HAOI2008]玩具取名[区间DP]

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1588  Solved: 925[Submit][Statu ...

  5. poj2955 Brackets (区间dp)

    题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...

  6. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  7. BZOJ 1260&UVa 4394 区间DP

    题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...

  8. 区间dp总结篇

    前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...

  9. Uva 10891 经典博弈区间DP

    经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...

随机推荐

  1. 20155327 信息安全技术 实验二 Windows口令破解

    课程:信息安全概论 班级:1553 姓名:了李百乾 学号:20155327 成绩: 指导教师: 李冬冬 实验日期及时间: 2017年10月11日 15:30-18:00 必修/选修:必修 实验序号:0 ...

  2. 20155339 2016-2017 2 《Java程序设计》第2周学习总结

    20155339 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 这周学习了课本的第三章,主要内容是JAVA的基础语法,在这章的学习过程中我发现大部分与c语言 ...

  3. 修改cmd为utf-8编码:

    1.组合键WIN+R键,组合键后就会弹出窗口,然后输入CMD,回车: 2.要修改成UTF8编码,输入命令CHCP 65001(设置为65001): 3.鼠标放在命令窗口的标题部分右键,在弹出的右键菜单 ...

  4. day5 RHCE

    19 .配置 iSCSI 服务端  (***先做这个题目**,挂载重启,机器会挂掉) 配置server0提供一个iSCSI服务磁盘名为iqn.2014-11.com.example:server0,并 ...

  5. charles录制https请求

    之前一直用windows系统,抓包什么的都是用的fiddler或者wireshark,操作比较简单,扩展性也比较强,现在因为工作原因换了mac,在网上一直没有找到fiddler的mac版本,就只能切换 ...

  6. 前端--再遇jQuery

    一.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回第一个属性) attr(属性名|属性值) --一个参数是获取属性的值,两个参数是设置属性值 --点击图片加载示例 removeAttr(属 ...

  7. Linux的10个最危险的命令

    Linux命令行佷有用.很高效,也很有趣,但有时候也很危险,尤其是在你不确定你自己在正在做什么时候. 这篇文章将会向你介绍十条命令,但你最好不要尝试着去使用. 当然,以下命令通常都是在root权限下才 ...

  8. 你的第一个接口测试:Python 接口测试

    前言: 首先我们先明确一个概念,什么叫接口.什么叫接口测试? 接口的全称叫[Application Programming Interface 又叫API],是提供应用程序与开发人员基于某软件或硬件得 ...

  9. 415. Valid Palindrome【LintCode java】

    Description Given a string, determine if it is a palindrome, considering only alphanumeric character ...

  10. 2.hive里的增删改查

    1.hive的增删改查 查询数据库 hive> show databases; OK default Time taken: 0.254 seconds, Fetched: 1 row(s) h ...