题目链接:http://codeforces.com/problemset/problem/706/C

题意:给出n个字符串,反转第 i 个字符串需要花费 ai,问通过反转操作将n个字符串变成升序排列,最小花费是多少,不能使其升序排列的话输出-1;

思路:dp

不难想到只有当前字符串的前一个字符串会对当前字符串产生直接影响,而每个字符串都只有反转和不反转两种状态;

我们可以用dp[i][0]表示第i个字符串不反转的情况从第0到第i个字符变成升序的需要的最小花费,dp[i][1]表示第i个字符串反转的情况从第0到第i个字符变成升序的需要的最小花费;

对于第 i 个字符串我们可以选择反转或者不反转,对于每种选择又会产生三中可能, 我们用str1, str2存储当前字符串和其反转字符串,s, rs存储前一个字符串和对应反转字符串,

那么有:

当前字符串不反转:

  str1>=s&&str1>=rs

  str1>=s&&str1<rs

  str1>=rs&&str1<s

当前字符串反转:

  str2>=s&&str2>=rs

  str2>=s&&str2<rs

   str2>=rs&&str2<s

想清楚了这些状态也就不难写出状态转移方程式了:

        if(str1>=s&&str1>=rs){
dp[i][]=min(dp[i-][], dp[i-][]);
}else if(str1>=s){
dp[i][]=dp[i-][];
}else if(str1>=rs){
dp[i][]=dp[i-][];
}else{
ok1=false; //不反转比s, rs都要小
}
//若当前字符串反转
if(str2>=s&&str2>=rs){
dp[i][]=min(dp[i-][], dp[i-][])+a[i];
}else if(str2>=s){
dp[i][]=dp[i-][]+a[i];
}else if(str2>=rs){
dp[i][]=dp[i-][]+a[i];
}else{
ok2=false;//反转比s, rs都要小
}

代码:

 #include <bits/stdc++.h>
#define ll long long
using namespace std; const int MAXN=1e5+;
const ll inf=0x3f3f3f3f3f3f3f3f;
ll dp[MAXN][], a[MAXN];//a数组存储花费
//dp[i][0]表示第i个字符串不反转的情况从第0到第i个字符变成升序的需要的最小花费,dp[i][1]表示第i个字符串反转的情况从第0到第i个字符变成升序的需要的最小花费 int main(void){
ios::sync_with_stdio(false), cin.tie(), cout.tie();
int n;
cin >> n;
for(int i=; i<n; i++){
cin >> a[i];
}
bool flag=true;
string s, rs, str1, str2;
cin >> s;
rs=s;
reverse(rs.begin(), rs.end());
dp[][]+=a[];
for(int i=; i<n; i++){
cin >> str1;
str2=str1;
reverse(str2.begin(), str2.end());
if(flag){
bool ok1=true, ok2=true;
//**若当前字符串不反转
if(str1>=s&&str1>=rs){
dp[i][]=min(dp[i-][], dp[i-][]);
}else if(str1>=s){
dp[i][]=dp[i-][];
}else if(str1>=rs){
dp[i][]=dp[i-][];
}else{
ok1=false; //不反转比s, rs都要小
}
//若当前字符串反转
if(str2>=s&&str2>=rs){
dp[i][]=min(dp[i-][], dp[i-][])+a[i];
}else if(str2>=s){
dp[i][]=dp[i-][]+a[i];
}else if(str2>=rs){
dp[i][]=dp[i-][]+a[i];
}else{
ok2=false;//反转比s, rs都要小
}
if(!ok1&&!ok2){
flag=false;
}else if(!ok1&&ok2){
dp[i][]=inf;
}else if(ok1&&!ok2){
dp[i][]=inf;
}
}
s=str1;
rs=str2;
}
ll ans=min(dp[n-][], dp[n-][]);
if(!flag||ans>=inf){
cout << - << endl;
}else{
cout << ans << endl;
}
return ;
}

cf706C(dp)的更多相关文章

  1. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4142  Solved: 1964[Submit][Statu ...

  2. 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4800 Problem Description A role-playing game (RPG and ...

  3. AEAI DP V3.7.0 发布,开源综合应用开发平台

    1  升级说明 AEAI DP 3.7版本是AEAI DP一个里程碑版本,基于JDK1.7开发,在本版本中新增支持Rest服务开发机制(默认支持WebService服务开发机制),且支持WS服务.RS ...

  4. AEAI DP V3.6.0 升级说明,开源综合应用开发平台

    AEAI DP综合应用开发平台是一款扩展开发工具,专门用于开发MIS类的Java Web应用,本次发版的AEAI DP_v3.6.0版本为AEAI DP _v3.5.0版本的升级版本,该产品现已开源并 ...

  5. BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4026  Solved: 1473[Submit] ...

  6. [斜率优化DP]【学习笔记】【更新中】

    参考资料: 1.元旦集训的课件已经很好了 http://files.cnblogs.com/files/candy99/dp.pdf 2.http://www.cnblogs.com/MashiroS ...

  7. BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

  8. px、dp和sp,这些单位有什么区别?

    DP 这个是最常用但也最难理解的尺寸单位.它与“像素密度”密切相关,所以 首先我们解释一下什么是像素密度.假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算 ...

  9. android px转换为dip/dp

    /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public int dipTopx(Context context, float dpValue) { final floa ...

随机推荐

  1. 链表的C++实现

      有的时候,处于内存中的数据并非连续的.那么这时候.我们就须要在数据结构中加入一个属性.这个属性会记录以下一个数据的地址.有了这个地址之后.全部的数据就像一条链子一样串起来了,那么这个地址属性就起到 ...

  2. Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'URIType' of bean class

    查阅了资料原始JDK的问题.解决方法 1.重新安装JDK为1.7版本 2.修改配置 1.webx的依赖改为3.1.6版: <dependency> <groupId>com.a ...

  3. Listfragment 列表标题 显示内容

    activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  4. HDU4511 小明系列故事——女友的考验 —— AC自动机 + DP

    题目链接:https://vjudge.net/problem/HDU-4511 小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memor ...

  5. PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)

    利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...

  6. NOIP 2016【蚯蚓】

    好吧,我承认我是个智障-- 这道题一眼看上去就是个堆,然而实际上有单调性. 注意到,如果 \(q = 0\) 的话,将蚯蚓的左右两边分开丢进两个队列中,则两个队列都是单调不增的,因为每次取出的蚯蚓长度 ...

  7. Linux下的磁盘缓存

    转自:http://blog.csdn.net/cywosp/article/details/21126161 前段时间在开发一个使用SSD做缓存的系统,在高速写入数据时会出现大量的磁盘缓存.太多的磁 ...

  8. hdu-5818 Joint Stacks(模拟)

    题目链接: Joint Stacks Time Limit: 8000/4000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Othe ...

  9. 遁入NOIP记

    回归noip啦 给自己定个小目标 500分起步 在这里列一下需要搞的东西OvO 1.算法基础 模拟 贪心 二分 分治 2.搜索 / 记忆化搜索 剪枝 对抗搜索 3.dp 状压 组合数学 树D 单队 D ...

  10. httpd服务相关实验

    实验环境: CentOS6.8 1.连接测试: 在/etc/httpd/conf/httpd.conf telnet 172.16.252.242 80 GET /index.html HTTP/1. ...